多重背包:每个物品有数量限制,并且有一个容量cash,从中选取物品组合,输出不能超过cash的最大值
原文:http://blog.csdn.net/domacles0124/article/details/11395187
#include<iostream>
#include<string.h>
using namespace std;
int num[1001],w[1001];
int dp[100001];
int cont[100001];
int cash,n;
void pack()
{
for(int i=1;i<=n;i++)//dp[i]代表dp[i]<=i
{
memset(cont,0,sizeof(cont));
for(int j=w[i];j<=cash;j++)
{
if(dp[j]<dp[j-w[i]]+w[i]&&cont[j-w[i]]<num[i])
{
dp[j] = dp[j-w[i]]+w[i];
cont[j]=cont[j-w[i]]+1;
}
}
}
}
int main()
{
while(cin>>cash)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>num[i]>>w[i];
memset(dp,0,sizeof(dp));
pack();
cout<<dp[cash]<<endl;
}
}