题目地址
AC代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <utility>
#include <map>
#include <cmath>
#include <cstring>
#include <deque>
#include <queue>
#include <cstdio>
#include <set>
using namespace std;
int dpList[100001];
vector<vector<pair<int,int> > >list(100001);
int main() {
ios::sync_with_stdio(false);
long long int cash;
int n;
while(cin>>cash>>n){
if(n==0){
cout<<0<<endl;
continue;
}
vector<pair<int,int> >basic;
for (int i = 0; i < n; ++i) {
int num,d;
cin>>num>>d;
basic.push_back(make_pair(num,d));
}
memset(dpList,0, sizeof(dpList));
list[0]=basic;
dpList[0]=1;
for (int j = 0; j <= cash; ++j) {
if(dpList[j]) {
for (int i = 0; i < list[j].size(); ++i) {
if (list[j][i].first != 0 && j + list[j][i].second <= cash) {
list[j + list[j][i].second] = list[j];
list[j + list[j][i].second][i].first--;
dpList[j + list[j][i].second]=1;
}
}
}
}
for (int k = cash; k>=0 ; --k) {
if(dpList[k]){
cout<<k<<endl;
break;
}
}
}
return 0;
}
虽说是个多重背包但是我这里用的却是线性搜索,总之还是过了,后面补一下多重背包的代码