POJ1260 Pearls(多重捆绑成0-1背包)

该怎样去思考?

1)有n种物品,

2)每选一种都要多加上10件,

3)每种物品有件数要求,也可选价格更高的代替,

问:求最少的耗费

如果暂时忽略掉条件23)的价格替换;那么装化为多重背包问题?

1.背包问题:

1)容量为总个数,且必须装满;

2)每件物品权值均为1

2.从具体问题分析:主要是在选和不选上浪费那10个额外的物品的钱,如果没有这个条件的话,那当然是尽量选钱数少的,也就是优先选满钱数少的,但现在有了这个条件,主要分有还是没有这个额外的钱数,也就是选和不选的问题,也就是把每种物品总个数捆绑成一个总物体代替,转化成0-1背包问题

由于一旦某处选了,则之前的必然全部选完,所以只需每次枚举上一次的选择点,取最优值即可,O(n^2)

 

【源程序】

#include <cstdio>
#include <cstring>
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
#define INF 1000000

int dp[1001],Cost[1001],Count[1001],Count1[1001];

int main(){
	//freopen("iofile\\input.txt","r",stdin);
	
	int T,n,i,j,k;
	scanf("%d",&T);
	
	while(T--){
		scanf("%d",&n);
		Count1[0]=0;
		for(i=1;i<=n;i++){
			scanf("%d%d",&Count[i],&Cost[i]);
			Count1[i] = Count1[i-1] + Count[i];
		}
		
		memset(dp,0,sizeof(dp));
		for(i=1;i<=n;i++){
			dp[i]=(Count1[i]+10)*Cost[i];
			for(j=0;j<i;j++){
				dp[i]=Min(dp[i],dp[j]+(Count1[i]-Count1[j]+10)*Cost[i]);
			}
		}
		
		printf("%d\n",dp[n]);
	}
	return 0;
}


posted on 2013-08-13 00:32  Gddxz  阅读(184)  评论(0编辑  收藏  举报

导航