求解一个多维背包问题
rd_qa 2012-08-22 04:15:52 如下一个二维背包问题:
TOJ3596,题意很简单,有N张光盘,每张光盘有一个价钱,现在要从N张光盘中买M张,预算为L,每张光盘有一个快乐值,要求在不超过预算并且恰好买M张,使得快乐值最大。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define INF 0x1f1f1f1f
using namespace std;
int dp[105][1005],cost[105],value[105];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int i,j,k,n,m,T,L;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&L);
for(i = 1;i <= n; ++i)
scanf("%d%d",&cost[i],&value[i]);
for(i = 1;i <= m; ++i)
for(j = 0;j <= L; ++j){
dp[i][j] = -INF;
dp[0][j] = 0;
}
for(k = 1;k <= n; ++k)
for(j = m;j >= 1; j--)
for(i = L;i >= cost[k]; --i){
dp[j][i] = max(dp[j][i],dp[j-1][i-cost[k]]+value[k]);
}
int ans = 0;
for(i = 1;i <= L; ++i)
if(dp[m][i] > ans)
ans = dp[m][i];
printf("%d/n",ans);
}
}
*************************
我想知道的是,如何求解选中的到底是那几张光盘?
先谢谢大家,呵呵。