01背包问题,对于没见物品要么留下要么舍弃。
不过这道题多了个输出路径的要求。
代码如下:
#include <cstdio>
#include <cstring>
#define M 10005
int n, max;
int a[25], d[M], f[25][M];
int main ()
{
while(~scanf("%d %d",&max,&n))
{
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
for(int i = n; i >= 1; i--)
for(int j = max; j >= a[i]; j--)
{
if(d[j]<=d[j-a[i]]+a[i])
{
d[j] = d[j-a[i]]+a[i];
f[i][j] = 1;
}
}
for(int i = 1, j = max; i <= n; i++) if(f[i][j])
{
printf("%d ",a[i]);
j-=a[i];
}
printf("sum:%d\n",d[max]);
}
return 0;
}