hdu 3496 Watch The Movie

題目鏈接: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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章