#include<bits/stdc++.h>
using namespace std;
struct ob{
int heavy;
int value;
};
vector<ob> val;
int dp[25][30000];
int main(){
int V,n,p;
cin>>V>>n;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
val.push_back((ob){a,a*b});
}
for(int j=val[0].heavy;j<=V;j++)
dp[0][j]=val[0].value;
for(int i=1;i<n;i++){
for(int j=0;j<=V;j++){
if(j>=val[i].heavy)dp[i][j]=max(dp[i-1][j],dp[i-1][j-val[i].heavy]+val[i].value);
else dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n-1][V];
return 0;
}
仍然可以用滚动数组优化(当然还有一维)
for(int i=1;i<n;i++){
for(int j=0;j<=V;j++){
if(j>=val[i].heavy)dp[1][j]=max(dp[0][j],dp[0][j-val[i].heavy]+val[i].value);
else dp[1][j]=dp[0][j];
}
swap(dp[0],dp[1]);
}