题意:
裸多重背包。
至于背包,学ACM的肯定都有一个叫做 背包九讲 的东西。这里就不讲了。就是将多重背包,运用二进制的思想转换成01背包。要把权值替换了。然后01背包就可以了。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long
#define maxn 100006
using namespace std;
int c[maxn],w[maxn];
int dp[maxn];
int main()
{
// read;
int N,n,i,j,k,t,x,b;
while(~scanf("%d",&N))
{
int cnt=0;
scanf("%d",&n);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
scanf("%d",&t);
scanf("%d",&b);
for(k=1;k<=t;k*=2)
{
w[cnt++]=k*b;
t-=k;
}
if(t)w[cnt++]=t*b;
}
for(i=0;i<cnt;i++)
{
for(j=N;j>=w[i];j--)
{
dp[j]=max(dp[j-w[i]]+w[i],dp[j]);
}
}
cout<<dp[N]<<endl;
}
}