思路
一个典型的分组背包,这里要用二进制优化转化成01背包
代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N=100000;
int f[N];
int n,m;
vector<int> v;
int main(){
while(cin >> m >> n){
v.clear();
memset(f,0,sizeof f);
for(int i=0;i<n;i++){
int w,s;
cin >> s >> w;
for(int k=1;k<=s;k*=2){
s-=k;
v.push_back(k*w);
}
if(s>0)v.push_back(s*w);
}
for(int i=0;i<v.size();i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+v[i]);
}
}
cout << f[m] << "\n";
}
}