---恢复内容开始---
#include<bits/stdc++.h> using namespace std; int a[30050],b[30050]; int mp[30050]; int n,i,tmp,m,j; int main() { while(scanf("%d %d",&n,&m)!=EOF) { memset(mp,0,sizeof(mp)); for(i=1;i<=m;i++) { scanf("%d %d",&a[i],&b[i]); } //m[i][j] 表示在面对第i件物品,且背包容量为 j时所能获得的最大价值 // //时间复杂度O(N * M),空间复杂度也为O(N * M) // for(i=1;i<=m;i++)//物品 // { // for(j=0;j<=n;j++)//资源 // { // if(j>=a[i])mp[i][j]=max(mp[i-1][j],mp[i-1][j-a[i]]+a[i]*b[i]); // else mp[i][j]=mp[i-1][j]; // } // // } //空间复杂度也为O(N) for(i=1;i<=m;i++)//物品 { for(j=n;j>=0;j--)//钱数 {//利用滚动数组求背包问题最合适的值 if(j-a[i]>=0) mp[j]=max(mp[j],mp[j-a[i]]+a[i]*b[i]); } } cout<<mp[n]<<endl; } return 0; }
---恢复内容结束---