#include <cstring>
#include <iostream>
using namespace std;
const int C=1005, N=105;
int c,n;
int dp[N][C];
int p[N],v[N];
int main() {
while (cin >> c >> n) {
//输入菜的价格和评分
for(int i=1;i<=n;i++) cin>>p[i]>>v[i];
//初始化dp数组
memset(dp, 0, sizeof dp);
//默认dp[0][j]初始化是0
for(int i=1;i<=n;i++){
for(int j=0;j<=c;j++){
if(j<p[i]) dp[i][j]=dp[i-1][j];
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-p[i]]+v[i]);
}
}
cout<<dp[n][c]<<endl;
}
}
// 64 位输出请用 printf("%lld")
典型的01背包问题:
注意点⚠️:
- i从1开始一直遍历到n,表示1到n个物品
- j从0开始一直遍历到m,表示体积从0增长到m;
- 如果压缩成一维的话,要从后往前遍历

京公网安备 11010502036488号