0/1背包
#include<bits/stdc++.h>
using namespace std;
int dp[30000] ,w[30000] , k[1000] ;
int main(){
int N , n , a, b;
cin>>N>>n;
for(int i=1 ; i<=n ; ++i){
cin>>a>>b;
k[i]=a;
w[i]=a*b;
}
for(int i=1 ; i<=n ; ++i){
for(int j=N; j>=0 ; --j){
if(k[i]<=j) dp[j]=max(dp[j],dp[j-k[i]]+w[i]);
}
}
cout<<dp[N];
}
状态转移方程 dp[ j ]=max(dp[ j ] , dp[ j - k[ i ] ]+w[ i ])
有些题目可以用dp[ k ] 表示前k项的和 用dp[ k ] -dp[ k-1 ]算出最终答案