题目描述如图
简单的01背包,
我们设
f
[
i
]
f[i]
f[i]表示体积为i时,能装填的最大体积,从题意上来看每种只能拿一次,那我们就倒叙循环
转移方程为
f
[
j
]
=
m
a
x
(
f
[
j
]
,
f
[
j
−
a
[
i
]
]
+
a
[
i
]
)
f[j] = max(f[j], f[j - a[i]] + a[i])
f[j]=max(f[j],f[j−a[i]]+a[i])
C o d e 代 码 Code代码 Code代码
#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
inline void read(int &s){
s = 0; int w = 1; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar();}
s *= w; return ;
}
int f[MAXN];
int a[MAXN];
int n, ans = -1, v;
int main()
{
read(v), read(n);
for(int i = 1; i <= n ; ++i){
read(a[i]);
}
f[0] = 0;
for(int i = 1; i <= n; ++i){
for(int j = v; j >= a[i]; j--){
f[j] = max(f[j - a[i]] + a[i], f[j]);
}
}
printf("%d\n", v - f[v]);
return 0;
}