题解 | 点菜问题

点菜问题

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;
  • 如果压缩成一维的话,要从后往前遍历
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务