01背包---点菜问题

https://www.nowcoder.com/questionTerminal/b44f5be34a9143aa84c478d79401e22a

复制代码
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip> 
using namespace std;
//菜的价格、评分 
int dp[105][1005]; //前几个菜,剩余的金额 
int jiage[105];
int defen[105];
int main() 
{
   int C,N;
   while(cin>>C>>N)
   {
        for(int i=1;i<=N;i++)
        {
           cin>>jiage[i]>>defen[i];    
     }
     for(int j=0;j<=C;j++)
       dp[0][j]=0;
     for(int i=0;i<=N;i++)
       dp[i][0]=0;
     for(int i=1;i<=N;i++)
      for(int j=1;j<=C;j++)
       {
            if(j>=jiage[i]) 
            {
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-jiage[i]]+defen[i]);
         }
         else
            dp[i][j]=dp[i-1][j];
       } 
       cout<<dp[N][C]<<endl;
   } 
   return 0;
} 
复制代码

注意后面两个循环是从1开始的。

红色部分易错。

简化方法:

dp[i][j]的转移仅与二维数组中本行的上一行有关,可以优化成一维数组。

dp[j]=max(dp[j],dp[j-jiage[i]]+defen[i]);

复制代码
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip> 
using namespace std;
//菜的价格、评分 
int dp[1005]; //前几个菜,剩余的金额 
int jiage[105];
int defen[105];
int main() 
{
   int C,N;
   while(cin>>C>>N)
   {
        for(int i=1;i<=N;i++)
        {
           cin>>jiage[i]>>defen[i];    
     }
     for(int j=0;j<=C;j++)
       dp[j]=0;
     for(int i=1;i<=N;i++)
      for(int j=C;j>=jiage[i];j--)
       {
         dp[j]=max(dp[j],dp[j-jiage[i]]+defen[i]);
       } 
       cout<<dp[C]<<endl;
   } 
   return 0;
} 
复制代码

必须保证在每次更新时,dp[j-jiage[i]]没有被更新,所以dp[j]遍历是倒序

posted @   Tomorrow1126  阅读(153)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
历史上的今天:
2019-10-04 链栈的实现
2019-10-04 顺序栈的实现
点击右上角即可分享
微信分享提示