題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3496
題目的大致意思就是duoduo想看電影,準備了n個想買對碟片對時間和價值,他爺爺只允許他看L時間對電影,並且商店只能批量出售,也就是一次只能出售m張,問應該如何購買,才能使總價值最大,且總時間不能超過L;
這個題就是個二維的揹包問題,且每個物品只能取0次或1次;
定義f[k][j]爲取k個物品且最長長度不超過j的最大價值,則f[k][j]=max(f[k][j],f[k-1][j-a[i].l]+a[i].w);
這裏要注意對是對數組初始化對時候都賦成-無窮;但是f[0][0]爲0;
這個賦成負無窮爲給搞了半天,想用memset,但是之前沒用過他,搞了半天才知道0x80是負無窮;
參考代碼:
#include <iostream>
#include <cstring>
using namespace std;
struct tt
{
int l;
int w;
}a[1001];
int m,l,n;
int f[101][1001];
void execute()
{
memset(f,0x80,sizeof(f));
f[0][0]=0;
for(int i=0;i<n;i++)
{
for(int k=m;k>=1;--k)
{
for(int j=l;j>=a[i].l;--j)
{
if(f[k][j]<f[k-1][j-a[i].l]+a[i].w)
f[k][j]=f[k-1][j-a[i].l]+a[i].w;
}
}
}
int ans=0;
for(int i=0;i<=l;i++)
if(f[m][i]>ans)
ans=f[m][i];
cout<<ans<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m>>l;
for(int i=0;i<n;i++)
{
cin>>a[i].l>>a[i].w;
if(a[i].l>l)
{
i--;
n--;
}
}
if(n<m)
cout<<0<<endl;
else
execute();
}
return 0;
}