4.6 每日一题题解

三角形

涉及知识点:

  • 背包dp

solution:

  • 背包是dp算法中非常经典的一个问题(如果打算学dp的同学必须要学会背包问题),具体的大家可以看我发在群里的背包九讲pdf
  • 关于这道题目,我们可以对每一个宝箱做一个背包
  • 题目要求从每一个宝箱中有且只能取一个,所以设dp[i][j]为枚举到第i个宝箱,可以获得钱数等于j的方案数
  • 那么转移方程就等于 dp[ i ][ z ] += dp[ i-1 ][ z - a[ i ][ j ] ] ,初始化dp[ 0 ][ 0 ] = 1
  • i代表前i个宝箱,z代表可以获得z钱,a[ i ][ j ]代表枚举的第i个宝箱的第j个钱,dp[ i ][ z ]就等于前i个宝箱可以获得z钱的方案数
  • j的范围是0~10000,最后从小到达枚举dp[ n ][ j ],代表前n个宝箱中可以获得钱数等于j的方案数,不断和k做差就得到了答案

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 105;
int a[maxn][maxn],dp[maxn][maxn*maxn],len[maxn];
int main()
{
    int n , k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>len[i];
        for(int j=1;j<=len[i];j++)
            cin>>a[i][j];
    }
    dp[0][0] = 1;

    for(int i=1;i<=n;i++){
        for(int z=0;z<=10000;z++){
            for(int j=1;j<=len[i];j++){
                dp[i][z] += dp[i-1][z-a[i][j]];
            }
        }
    }
    ll ans = 0;
    for(int i=1;i<=10000;i++){
        if(dp[n][i] >= k){
            ans += 1ll*k*i;
            break ;
        }else{
            ans += 1ll*dp[n][i]*i;
            k -= dp[n][i];
        }
    }
    cout<<ans<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/QFNU-ACM/p/12640491.html

时间: 2024-10-31 22:22:01

4.6 每日一题题解的相关文章

3.25 每日一题题解

tokitsukaze and Soldier 题目链接:https://ac.nowcoder.com/acm/problem/50439 涉及知识点: 优先队列/贪心 solution: 每个士兵都有战力Vi和一个限制Si,我们先按照每个士兵的Si从大到小进行排序 然后我们根据排好序的士兵遍历 因为士兵的Si从大到小,所以遍历的过程中,当前遍历的士兵对应的si一定是最小 所以我们可以维护一个大小由Si较小的优先队列 如果队列大小小于当前遍历士兵的Si,就扔到优先队列里,一旦士兵的人数超过限制

3.21 每日一题题解

小K的疑惑 题目链接:https://ac.nowcoder.com/acm/problem/20823 涉及知识点: 思维/搜索/简单图论 solution: 题目要求??????(??,??) = ??????(??,??) = ??????(??,??) ,首先要满足每两个节点的距离都是偶数,即??????(??,??) = ??????(??,??) = ??????(??,??) = 0 由于树上任意两点的距离是唯一的,所以如果i到j的距离是奇数,j到k的距离是奇数,那么i到k的距离一

3.22 每日一题题解

Farewell Party 题目链接:https://codeforces.com/problemset/problem/1081/B 涉及知识点: 思维/构造 solution: 考虑颜色不同的人数不是很好想,下面我们考虑帽子颜色相同的人数 样例2的3 3 2 2 2,反过来就是2 2 3 3 3 这样是不是就能看出来如何判断了,把颜色相同的人加到一起,如果加起来人的个数 = 对应颜色相同的人数,就对了 当然不是! 如果输入 2 2 2 2 ,我们会输出Impossible,其实我们忽略了一

3.31 每日一题题解

Arpa's obvious problem and Mehrdad's terrible solution 题目链接:http://codeforces.com/problemset/problem/742/B 涉及知识点: 数学 solution: 题意就是让你找出给定数列里两两异或值为x的组合个数 暴力n方,会超时 根据异或运算性质:a^b=x; x^a=b; x^b=a; 所以可以直接O(n)的遍历每一个数,查找x异或这个数是否存在即可 std: #include <bits/stdc+

4.11 每日一题题解

完全平方数 题目链接:https://ac.nowcoder.com/acm/contest/37/A 涉及知识点: 暴力/二分 solution: \(祝大家周末愉快\) \([1,n]区间的完全平方数的个数等于\) \(\sqrt{n}\) \([L,R]区间的完全平方数的个数可以理解为\) $\sqrt{R} - \sqrt{L-1} $ \(0也是完全平方数,L和R是否为0判断一下即可\) \(当然将所有平方数放入数组,lowerbound二分也是时间复杂度允许的可行解\) std: #

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

问题背景: 生成9*9乘法表 [[email protected] ~]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 1x1=1 1x2=2   2x2=4 1x3=3   2x3=6   3x3=9 1x4=4   2x4=8   3x4=12  4x4=16 1x5=5

老男孩教育每日一题-第83天-binlog是什么?记录的什么?有几种工作模式及企业应用场景

参考答案 含义 binlog:是用于记录所有更新了数据的操作语句,语句以事件的形式保存,它描述数据的更改过程作用:用于实时备份数据,数据库的主从复制log_bin 打开记录binlog功能 binlog的查看 mysqlbinlog /home/mysql/binlog/binlog.000003 binlog的删除:可分为自动与手动删除 自动删除 能过binlog参数expire_logs_days来实现 show binary logs; show variables like "expir

&#8203;老男孩教育每日一题-第85天-下面这个脚本直接执行没有问题,在定时任务中有问题,什么原因?

脚本内容: [[email protected] scripts]# cat /server/scripts/ip.sh  #!/bin/bash IP=$(ifconfig eth0 |awk -F "[ :]+" 'NR==2{print $4}') echo "ip:$IP" >> /tmp/ip.txt 定时任务: [[email protected] scripts]# crontab -l * * * * * /bin/bash /serve