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

来源:互联网 发布:苹果怎么清理淘宝缓存 编辑:程序博客网 时间:2024/05/10 02:05

该怎样去思考?

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 1000000int 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;}


原创粉丝点击