Description
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从m个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
[样例]
输入:
24 一个整数,表示箱子容量
6 一个整数,表示有n个物品
8 接下来n行,分别表示这n个物品的各自体积。
3
12
7
9
7
输出:
0 一个整数,表示箱子剩余空间。
Input
第一行为箱子容量为v;第二行为物品数;以下n行分别为每个物品的体积;
Output
箱子剩余空间
Sample Input
24 6 8 3 12 7 9 7
Sample Output
0
Source
#include <stdio.h>
#include <string.h>
int main()
{
int a[100], v, n, i, j, k, b[20001], t;
scanf("%d%d", &v, &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(b, 0, sizeof(b));
k = 0;
b[0] = 1;
for (i = 1; i <= n; i++)
{
t = k;
for (j = k; j >= 0; j--)
if (b[j] == 1 && j + a[i] <= v)
{
b[j + a[i]] = 1;
if (j + a[i] > t)
t = j + a[i];
}
k = t;
}
printf("%d\n", v - k);
return 0;
}