题目简介
有一个箱子容量为 V (正整数,0≤V≤20000),同时有 n 个物品(0 < n ≤ 30),每个物品有一个体积(正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
说明
考虑到n,V都不大,可以用搜索和动规两种方法来做。
可以说是模板题了。
搜索:
#include <stdio.h>
#include <memory.h>
int v, n, max, a[31];
void dfs(int cnt, int now)
{
if (now > v) return;
if (cnt == n + 1){
if (now > max) max = now;
return;
}
dfs(cnt + 1, now);
dfs(cnt + 1, now + a[cnt]);
}
int main(void)
{
while(~scanf("%d", &v)){
int i;
scanf("%d", &n);
memset(a, 0, sizeof(a));
for (i = 0; i < n; ++i)
scanf("%d", &a[i]);
max = 0;
dfs(0, 0);
printf("%d\n", v - max);
}
return 0;
}
动规:
#include <stdio.h>
int main(void)
{
int n, m, w, i, j;
while(~scanf("%d%d", &m, &n)){
int dp[20000] = {0};
for (i = 0; i < n; ++i){
scanf("%d", &w);
for (j = m; j >= w; --j)
if (dp[j - w] + w > dp[j]) dp[j] = dp[j - w] + w;
}
printf("%d\n", m - dp[m]);
}
return 0;
}