多重背包基础题:
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;
}