poj 1276 多重背包
题目意思:给 cash n 种 货币 然后再给每种货币的数量以及面值
要求你输出 cash 最多输出 多少
很简单的多重背包问题
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10005
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define scab(a,b) sca(a),sca(b)
using namespace std;
int n,cash;
bool dp[maxn*10];
int w[maxn];
int c[maxn];
int v[maxn*10];
int main()
{
while(scanf("%d%d",&cash,&n)>0)
{
mem(w,0);
mem(c,0);
mem(v,0);
mem(dp,0);
dp[0]=1;
int Count=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&c[i],&w[i]);
}
for(int i=0;i<n;i++)
{
if(c[i]==0||w[i]==0)
continue;
int bit = 1;
int d = c[i];
while(0<c[i]-bit)
{
c[i]-=bit;
v[Count++]=w[i]*bit;
bit=bit<<1;
}
v[Count++]=w[i]*(c[i]);
}
for(int i=0;i<Count;i++)
{
for(int j=cash;j>=v[i];j--)
{
dp[j]|=dp[j-v[i]];
}
}
int ans;
for(int i=cash;i>=0;i--)
{
ans=i;
if(dp[i]) break;
}
printf("%d\n",ans);
}
return 0;
}