解题思路:
典型的0-1背包问题,唯一的区别在于需要输出选择的背包的value。因为是special judge,所以不需要考虑输出的顺序,当f[j-w[i]]+w[i]>f[j]条件满足时,代表该物品被选中,注意j需要从V到0逆序递减,此时记录p[i][j]为1,之后再次遍历p数组,当元素值为真时输出对应物品的价值即可。注意这里的物品价值和体积均对应于唱片播放时间。
参考代码:
#include <iostream>
#include <cstring>
using namespace std;
int V,N;//N件物品 背包容量为V
int w[25];//weight&value
int f[10005];
int p[25][10005];
int main(int argc, const char * argv[]) {
while (cin>>V>>N) {
for (int i=1; i<=N; i++) {
cin>>w[i];
}
memset(f, 0, sizeof(f));
memset(p, 0, sizeof(p));
for (int i=1; i<=N; i++)
for(int j=V;j>=0;j--)
if(w[i]<=j)
{
if(f[j-w[i]]+w[i]>f[j]){
f[j]=f[j-w[i]]+w[i];
p[i][j]=1;
}
}
for (int i=N,j=V; i>=0&&j>=0; i--) {
if(p[i][j]){cout<<w[i]<<" ";//value
j-=w[i];//weight
}
}
cout<<"sum:"<<f[V]<<endl;
}
return 0;
}