揹包問題(4)-混合揹包

混合揹包
題目描述:
有 N 種物品和一個容量是 V 的揹包。物品一共有三類:
第一類物品只能用1次(01揹包);
第二類物品可以用無限次(完全揹包);
第三類物品最多隻能用 si 次(多重揹包);
每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。

我們通過這道例題櫻花來講講混合揹包

混合揹包問題就是混合01揹包、完全揹包和多重揹包,可供選擇的物體i可能有一個、或者無數個、或者有限個。所以,就不要考慮這麼多了,直接分這三種情況考慮就行!!

當然,你也可以把它都看成多重揹包,01揹包就是隻能選一件嘛,那完全揹包能選的個數就定無窮大不就好了嗎?(輕鬆解決!

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=999999;
const int N=1e6+100;
struct node
{
	int w,v;
} a[N];
int ts1,ts2,te1,te2,n,C,w,v,cnt,tot,f[N];
void multi(int cnt,int w,int v)
{
	for(int i=1;i<=cnt;i*=2)
	{	
		a[++tot].w=i*w;
		a[tot].v=i*v;
		cnt-=i;
	} 
	if(cnt) a[++tot].w=cnt*w,a[tot].v=cnt*v;
}
int main()
{
	//fre();
	scanf("%d:%d %d:%d %d",&ts1,&ts2,&te1,&te2,&n);
	C=te1-ts1;
	if(te2<ts2) C=(te1*60+te2)-(ts1*60+ts2);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&w,&v,&cnt);
		if(!cnt) cnt=MAX;
		multi(cnt,w,v);
	}
	for(int i=1;i<=tot;i++)
		for(int j=C;j>=a[i].w;j--)
			f[j]=max(f[j],f[j-a[i].w]+a[i].v);
	printf("%d",f[C]);
	return 0;
}

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