http://acm.hdu.edu.cn/showproblem.php?pid=3496
很典型的一道二维背包的题目,在保证时间不超出l的情况下还要保证碟片恰好为m。第一次做二维背包,错了n多次,原来才发现数组中应该为i,不应该为j。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=100000000;
struct node
{
int t,v;
}a[103];
int dp[103][1003];//dp[i][j]表示买i部花费时间为j的碟片所获得的价值
int n,m,l;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d%d%d",&n,&m,&l);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].t,&a[i].v);
//初始化这一块,如果是恰好能装满除dp[0][0]=0外,
//其余都初始化为负无穷
for(int i=0;i<=n;i++)
for(int j=0;j<=l;j++)
dp[i][j]=-inf;
dp[0][0]=0;
for(int i=0;i<n;i++)
{
int minx=min(i+1,m);
for(int j=minx;j>0;j--)
{
for(int k=l;k>=a[i].t;k--)
dp[j][k]=max(dp[j][k],dp[j-1][k-a[i].t]+a[i].v);//这里wrong了n次,原来写成j了。。。。。。。
}
}
//if(dp[m][l]==0) {cout<<"0"<<endl;continue;}
int maxx=-1;
for(int i=1;i<=l;i++)
if(maxx<dp[m][i])
maxx=dp[m][i];
if(maxx==-1) {cout<<"0"<<endl;continue;}
printf("%d\n",maxx);
}
return 0;
}