传送门 | 难度 |
---|---|
https://www.luogu.com.cn/problem/P2925 | 普及- |
这是一道0/1背包板子题,而且由于只考虑体积,甚至都不需要价值数组。
符号表示
- v:体积数组
- f:动态规划数组
状态转移方程
- 状态转移方程为
f[j]=max{f[j],f[j-v[i]]+v[i]}
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
int C, H;
int f[50005];
int v[5005];
int inline bigger(int a, int b) {
return a > b ? a : b;
}
int main() {
while (scanf("%d%d", &C, &H)!=EOF) {
for (int i = 0; i < H; ++i)
scanf("%d", &v[i]);
for (int i = 0; i <= C; ++i)
f[i] = 0;
for (int i = 0; i < H; ++i) {
for (int j = C; j >= v[i]; --j) {
f[j] = bigger(f[j], f[j - v[i]] + v[i]);
if (f[C] == C) {//补个优化,满足即可退出
printf("%d", C);
return 0;
}
}
}
printf("%d", f[C]);
}
return 0;
}