题目
题目大意
给你n件物品,每件物品有其容量且只有一件,求每件物品总和在不超过m时最大的容量,并输出解决方案
题解
若把每件物品的价值看作容量,那么本题显然是01背包问题,唯一不同的是需要输出解决方案,所以要额外开个数组,记录是由哪个状态转移而来。
代码
#include <iostream>
using namespace std;
const int N = 1e4 + 10;
int f[N][N],tra[N][N],w[N],p[N],ans[N];
int main()
{
int n,space;
while(scanf("%d%d",&space ,&n)!=EOF)
{
for(int i = 1; i <= n; i ++)
{
scanf("%d",&w[i]);
p[i] = w[i];
}
f[0][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j<=space; j++)
if(j>=w[i])
{
if(f[i-1][j] > f[i-1][j-w[i]]+w[i])
{
f[i][j] = f[i-1][j];
tra[i][j] = 0;
}
else
{
f[i][j] = f[i-1][j-w[i]]+w[i];
tra[i][j] = 1;
}
}
else
{
f[i][j] = f[i-1][j];
tra[i][j] = 0;
}
int t = space, cnt = 0;
for(int i = n; i >= 1; i --)
if(tra[i][t])
{
ans[++cnt] = w[i];
t -= w[i];
}
for(int i = cnt; i >= 1; i--)
printf("%d ",ans[i]);
//printf("\n");
printf("sum:%d\n",f[n][space]);
}
return 0;
}