题目概况
链接: https://nanti.jisuanke.com/t/T1263
难度: 普及/提高-(计蒜客评价普及T3,个人认为T2,其实就是01背包板子题)
题目分析
简化题目: 有个背包,还有一堆东西,你可以选也可以不选,反正求出来有多少种选择方式(讲白了就是01背包板子题)
涉及知识点: 动态规划、01背包
解题思路:
1. 输入物品的体积
2. DP,状态转移方程为 f[j] = max(f[j], f[j] + f[j - a[i]])
(不选就f[j]
;选就f[j] + f[j - a[i]]
)
代码要点拆解
这…有必要拆解讲了吗
注意点我直接在完整代码的注释里写
完整代码
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 500; //400+5也行
int f[MAXN];
int n, a[MAXN];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
f[0] = 1; //初始化一定要记得!!!不然一直0!!!
for (int i = 1; i <= n; i++) {
for (int j = 400; j >= a[i]; j--) {
f[j] = max(f[j], f[j] + f[j - a[i]]) % 10000; //记得取模
}
}
cout << f[400] << endl;
return 0;
}