主要是看到一个题目,我的解决思路里面有一步就是要把选中的物品标记上,所以就写了这个程序,主要思路就是用一个pre数组在每一次背包更新时就记录下物品的标号,最后从最大体积回溯输出就可以了,程序是结合01背包经典例题——选珠宝(poj3624)给出的
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=15000;
const int Maxn=4000;
int c[maxn],val[maxn];
int f[maxn];
int pre[maxn];
int main()
{
int N,M;
memset(pre,-1,sizeof(pre));
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
{
scanf("%d%d",&c[i],&val[i]);
}
memset(f,0,sizeof(f));
for(int i=0;i<N;i++)
{
for(int v=M;v>=0&&v-c[i]>=0;v--)
{ //注意要加上v-c[i]>=0;
if(f[v]<f[v-c[i]]+val[i])
{
f[v]=f[v-c[i]]+val[i];
<span style="color:#FF0000;"> pre[v]=i</span>;
}
}
}
int mx=0,maxNum=-1;
for(int k=0;k<=M;k++)
{
if(mx<f[k])
{
mx=f[k];
<span style="color:#FF0000;">maxNum=k</span>;
}
//printf("%d:%d\n",k,f[k]);
}
<span style="color:#FF0000;">for(int v=maxNum;pre[v]!=-1;v-=c[pre[v]])
{
printf("thing:%d\n",pre[v]);
}</span>
printf("%d\n",mx);
return 0;
}