题解 | #完全背包问题#

原题链接

题目描述

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

输入描述

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);

第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。

输出描述

输出最大总价值。格式:“max=12”

完全背包问题

每种物品有无穷多个,物品i的体积:w[i]、价值:v[i]

dp[i][j]:前i种物品装进容量为j的背包所获得的最大价值

与0-1背包唯一区别:dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]) 放得下时还可以继续选

#include<iostream>
using namespace std;
const int maxn=1001;
int w[maxn];
int v[maxn];
int dp[maxn][maxn];

int best(int sum,int n){
    for(int i=0;i<=n;i++){
        dp[i][0]=0;
    }
    for(int i=0;i<=sum;i++){
        dp[0][i]=0;
    }
    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=sum;j++){
            if(w[i]>j)dp[i][j]=dp[i-1][j];
            else dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);//唯一修改
        }
    }
    return dp[n][sum];
}


int main(){
    int sum,n;
    while(scanf("%d%d",&sum,&n)!=EOF){
        for(int i=1;i<=n;i++)scanf("%d%d",&w[i],&v[i]);
        printf("max=%d\n",best(sum,n));
    }
}

优化:压缩空间

  • dp[i][j]只取决于上一行dp[i-1][j]和本行前面dp[i][j-w[i]]的值
  • 从前往后更新
#include<iostream>
using namespace std;
const int maxn=1001;
int w[maxn];
int v[maxn];
int dp[maxn];

int best(int sum,int n){
    
    for(int i=0;i<=sum;i++){
        dp[i]=0;
    }
    
    for(int i=1;i<=n;i++){
        for(int j=w[i];j<=sum;j++){//从前往后更新
             dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    }
    return dp[sum];
}

int main(){
    int sum,n;
    while(scanf("%d%d",&sum,&n)!=EOF){
        for(int i=1;i<=n;i++)scanf("%d%d",&w[i],&v[i]);
        printf("max=%d\n",best(sum,n));
    }
}

algorithm 文章被收录于专栏

外源题解补充

全部评论
回溯+记忆搜索 ``` int maxValue(vector<int>&w,vector<int>&v,int capacity){ int n = w.size(); //数组存储已经得到过的dfs{i,c) vector<vector><int>> cache(n,vector<int>(capacity+1,-1)); function<int> dfs = [&](int i,int c){ if(i < 0||c < 0) return 0; int& res = cache[i][c]; if(res!=-1) return res; if(c</int></int></int></vector></int></int>
点赞 回复 分享
发布于 2023-11-11 14:39 北京
新人菜鸟表示看不懂
点赞 回复 分享
发布于 2023-02-12 20:51 广东
感谢牛客大佬的分享
点赞 回复 分享
发布于 2023-02-12 20:39 湖北

相关推荐

牛客97567122...:我最近投的几个,都是要不已读不回,要不不回,还有直接拒绝的
点赞 评论 收藏
分享
10-15 18:02
已编辑
香港中文大学 golang
秋招有幸一开始就拿了淘天的笔面,并且美团转正的意向也顺利通过后续在淘天和字节两个&nbsp;9&nbsp;月主要流程都走到了&nbsp;hr&nbsp;面,国庆节后一个通过,一个横向挂了其他面过的包括:b&nbsp;站一面挂&nbsp;八股还行,最后手撕给了个笔试压轴限时&nbsp;15min...整段垮掉阿里控股&nbsp;kpi一面➕换部门走到二面,控股的都不喜欢开摄像头京东一面挂&nbsp;常规问题,但是疑似成都&nbsp;base&nbsp;hc&nbsp;很少,并且透露了已经转正,目前池子里无人捞腾讯正在二面&nbsp;一面体验不错,还指出了要改进的地方,提示二面不会再问问过的问题快手一面未知小红书一面未知字节换部门一面不喜欢业务,又回到了人才库大麦约面,准备拒掉虾皮一面&nbsp;无后续流程,面试聊的还行,感觉上海&nbsp;base&nbsp;池子满了---------------------------------------------------------------------------感觉秋招可以结束了,后续感觉走完这个腾讯流程就随缘面面&nbsp;t&nbsp;和&nbsp;b,主包家在南京,奈何南京没啥好的民营企业和互联网氛围,以及好国企又太难进,不知道淘天这个意向够不够直接结束秋招了...今天去深圳&nbsp;nip&nbsp;主场看了一下入围赛,主队不是这两家,还是觉得&nbsp;ig&nbsp;可惜了,有很好的机会没有抓住。感触和我字节&nbsp;hr&nbsp;面挂一样评论区有推荐的字节杭州上海base的业务线或者有字节&nbsp;hr&nbsp;uu&nbsp;可以捞一下吗?
肖先生~:大佬都这么强了还要干啥啊
我的求职进度条
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

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