多重背包-51nob 1086 背包问题 V2

来源:互联网 发布:ubuntu如何下载安装vim 编辑:程序博客网 时间:2024/05/16 08:51

多重背包基础题:

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086

思路:

把每种物品拆成多份,使这些拆成的看为01背包,之后dp拆分好的01背包。

#include<cstdio>#include<cstring>#include<algorithm>#include <iostream>using namespace std;int dp[50050];int w[100000],p[100000];int main(){int n,m,cot=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)    {        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        for(int i=1;c!=0;i=i*2)        {            if(c>=i)            {                w[cot]=i*a;                p[cot++]=i*b;                c-=i;            }            else            {                w[cot]=c*a;                p[cot++]=c*b;                c=0;            }        }    }    for(int i=0;i< cot;i++)    {        for(int j=m;j>=w[i];j--)            dp[j]=max(dp[j],dp[j-w[i]]+p[i]);    }    cout<<dp[m]<<endl;return 0;}


0 0
原创粉丝点击