题意:
背包+路径记录
题解:
用一个vis[i][j]记录容量为j的背包里面有没有用到过i物品,物品是倒着放的,具体实现看代码
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10005;
int cd[25],dp[N],v[25];
bool vis[25][N];
int main()
{
int i,j,n,m;
while(scanf("%d",&m)!=EOF){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&v[i]);
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
for(i=n;i>=1;i--){
for(j=m;j>=v[i];j--){
if(dp[j-v[i]]+v[i]>dp[j]){
vis[i][j]=1;
dp[j]=dp[j-v[i]]+v[i];
}
}
}
for(i=1,j=dp[m];i<=n&&j>0;i++)
if(vis[i][j]){
printf("%d ",v[i]),j-=v[i];
}
printf("sum:%d\n",dp[m]);
}
}