混合背包

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

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

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

#include 
#include
#include
#define Max(a,b) a>b?a:b
#define Min(a,b) a=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]);
}

你可能感兴趣的:(混合背包)