#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int dp[100001];
int cash,N;
struct money
{
int num;
int value;
};
money moneys[10];
int main()
{
while (scanf("%d%d",&cash,&N)!=EOF)
{
for (int i=0;i<N;++i)
{
scanf("%d%d",&moneys[i].num,&moneys[i].value);
}
memset(dp,0,sizeof(dp));
int maxValue = 0;
for (int i=0;i<N;++i)
{
money &m = moneys[i];
if (m.num * m.value >=cash)//完全背包问题
{
for (int v=m.value;v<=cash;++v)
{
dp[v] = max(dp[v],dp[v-m.value] + m.value);
}
continue;
}
//多重背包问题
int count = m.num;
int k = 1;
while(k<count)
{
int value = k * m.value;
for (int v=cash;v >=value;--v)
{
dp[v] = max(dp[v],dp[v-value] +value);
}
count -=k;
k = 2*k;
}
int value = count * m.value;
for (int v=cash;v>=value;--v)
{
dp[v] = max(dp[v],dp[v-value] + value);
}
}
cout<<dp[cash]<<endl;
}
return 0;
}
poj1276
最新推荐文章于 2015-08-06 09:32:05 发布