这个就是个提醒二进制的。直接看码吧。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int cash, n;
int c[100], f[100005];
int i, j, k;
int num, cost, d;
while(scanf("%d%d",&cash,&n)!=EOF){
d = 1;
for (i=1;i<=n;i++){
scanf("%d%d",&num,&cost);
j=1;//核心部分
while(j<=num){
c[d++] = j*cost;
num-=j;
j*=2;
}
if (num>0){
c[d++] = num*cost;
}
}
memset(f,0,sizeof(f));
for (i=1;i<=d-1;i++){
if (cash>=c[i]){
for (k=cash;k>=c[i];k--)
f[k] = max(f[k],f[k-c[i]]+c[i]);
}
}
printf("%d\n",f[cash]);
}
return 0;
}