混合背包

混合背包:三种背包的混合,有的物品只可以取一次(01 背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。

题解:只需要简单的判断下属于什么类型的背包,然后套相应的模板就行

http://codevs.cn/problem/3269/

#include <cstdio>
#include<algorithm>
#include<string.h>
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
using namespace std;
int main()
{
    int dp[200010],val[210],vom[210],num[210];
        int n,v;
        scanf("%d%d",&n,&v);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",vom+i,val+i,num+i);
        }
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            if(num[i]==1)
            {
               for(int j=v;j>=vom[i];j--)
               {
                    dp[j]=Max(dp[j],dp[j-vom[i]]+val[i]);
               }
            }
            else if(num[i]<0)
            {
                for(int j=vom[i];j<=v;j++)
               {
                    dp[j]=Max(dp[j],dp[j-vom[i]]+val[i]);
               }
            }
            else
            {
                int dig=num[i],tmp;
                for(int k=1;dig>0;k<<=1)
                {
                    tmp=Min(k,dig);
                    for(int j=v;j>=tmp*vom[i];j--)
                    {
                        dp[j]=Max(dp[j],dp[j-tmp*vom[i]]+tmp*val[i]);
                    }
                    dig-=k;
                }

            }
        }
        printf("%d\n",dp[v]);
}
    原文作者:Bellman-Ford
    原文地址: https://www.jianshu.com/p/2ea805f565dd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞