题目:
http://blog.youkuaiyun.com/qq_35786326/article/details/79048011
题意:
求如何组合放入背包的物品可以将价值最大化
分析:
这道题,直接将多重背包赤裸裸地展现在我们眼前,所以,呵呵...
但在这里,我就没有使用二分优化,因为ta过于麻烦了...
代码:
#include<cstdio>
#include<iostream>
#define LL long long
using namespace std;
inline LL read(){
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int f[5001];
int max(int x,int y)
{
return x>y? x:y;
}
int main()
{
int t,a,b,c,k=0,n,m,s[5001],v[5001],w[5001];
n=read();m=read();
for(int i=1;i<=n;i++)
s[i]=read(),w[i]=read(),v[i]=read();
for(int i=1;i<=n;i++)//多重背包
for(int j=m;j>=0;j--)
for(int k=0;k<=s[i];k++)
{if(j-k*w[i]<0) break; f[j]=max(f[j],f[j-k*w[i]]+k*v[i]);}
printf("%d",f[m]);//输出最大值(m以内)
return 0;
}