0/1背包问题的最简单特殊情况,重量和价值相等。要求输出放入了哪些物品,顺序和输入的时候相同,这样从DP的时候从后面往前面递推就好了。
背包问题可以只用一个一维数组表示,这样节省空间。
#include <stdio.h>
#include <string.h>
#define W 10005
int c[W], l[25];
bool p[25][W];
int main()
{
int w, n;
while(~scanf("%d", &w))
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &l[i]);
memset(c, 0, sizeof(c));
memset(p, 0, sizeof(p));
for(int i = n; i; i--)
for(int j = w; j >= l[i]; j--)
{
if(c[j] < c[j - l[i]] + l[i])
{
c[j] = c[j - l[i]] + l[i];
p[i][j] = 1;
}
}
for(int i = 1, j = w; i <= n; i++)
if(p[i][j])
{
printf("%d ", l[i]);
j -= l[i];
}
printf("sum:%d\n", c[w]);
}
return 0;
}