题解 | 点菜问题
点菜问题
https://www.nowcoder.com/practice/b44f5be34a9143aa84c478d79401e22a
#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;
- 如果压缩成一维的话,要从后往前遍历