首页 > 其他分享 >背包九讲 完全背包

背包九讲 完全背包

时间:2024-06-02 20:22:16浏览次数:20  
标签:node 背包 九讲 int 完全 体积 物品 dp

https://www.acwing.com/problem/content/3/

有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用。
第 i 种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10

有了01背包的思路 完全背包就比较简单了
我们定义dp[i][j]为前i个物品 放入容积为j的背包能达到的最大价值
那么不妨的情况 dp[i][j] =dp[i-1][j];
在前i个物品 在总体积允许的情况下,不断的尝试放入第i个物品
dp[i][j]= dp[i-1][j-v]+w; 是前i-1个物品 放入容积为j的背包能得到最大价值的基础上, 尝试放入一个物品
在完全背包情况下 dp[i][j]= dp[i][j-v]+w; 只要j小于题目的体积总和,我们可以不断尝试。注意体会dp[i-1][j-v]+w和dp[i][j-v]+w区别
代码如如下

#include <iostream>

using namespace std;

const int N = 1010;
int dp[N][N];
struct NODE{
    int v,w;
}node[N];
int n,v;

int main(){
    cin >>n >>v;
    for(int i=1;i<=n;i++){
        cin >> node[i].v >> node[i].w;
    }
    
    for(int i= 1;i<=n;i++){
        for(int j=0;j<=v;j++){
            dp[i][j]=dp[i-1][j];
            if(j>= node[i].v)
                dp[i][j] = max(dp[i][j],dp[i][j-node[i].v]+node[i].w);
        }
    }
    
    cout << dp[n][v]<<endl;   
}

二维降为一维

#include <iostream>

using namespace std;

const int N = 1010;
int dp[N];
struct NODE{
    int v,w;
}node[N];
int n,v;

int main(){
    cin >>n >>v;
    for(int i=1;i<=n;i++){
        cin >> node[i].v >> node[i].w;
    }
    
    for(int i= 1;i<=n;i++){
        for(int j=0;j <=v;j++){
            if(j>=node[i].v){
                dp[j]=max(dp[j],dp[j-node[i].v]+node[i].w);
            }
        }
    }
    
    cout << dp[v]<<endl;   
}

在 代码格式编写上做一点小小的简化

#include <iostream>

using namespace std;

const int N = 1010;
int dp[N];
struct NODE{
    int v,w;
}node[N];
int n,v;

int main(){
    cin >>n >>v;
    for(int i=1;i<=n;i++){
        cin >> node[i].v >> node[i].w;
    }
    
    for(int i= 1;i<=n;i++){
        for(int j=node[i].v;j <=v;j++){
           dp[j]=max(dp[j],dp[j-node[i].v]+node[i].w);
        }
    }
    
    cout << dp[v]<<endl;   
}

我的视频题解空间

标签:node,背包,九讲,int,完全,体积,物品,dp
From: https://www.cnblogs.com/itdef/p/18227551

相关文章

  • python系列&AIi系列(参考性极强):【完全攻略】Gradio:建立机器学习网页APP
    【完全攻略】Gradio:建立机器学习网页APP【完全攻略】Gradio:建立机器学习网页APP前言一、Gradio介绍以及安装1-1、Gradio介绍Gradio:1-2、安装二、快速开始(初步了解)2-1、简单小栗子2-2、多输入多输出2-3、简易聊天机器人三、关键技术3-1、带有样例的输入3-2、提示弹窗3-......
  • 6.2 休息日 背包问题总结
    就目前所遇到的01背包与完全背包作总结。01背包有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。二维dp数组01背包动规五部曲1.确定dp数组以及下标的含义dp[i......
  • day46 完全背包理论基础 518. 零钱兑换 II 377. 组合总和 Ⅳ
    完全背包理论基础有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全......
  • day44 01背包问题 416. 分割等和子集
    背包问题01背包有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。暴力的解法每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么......
  • Transformer 模型完全解读:代码+注释+讲解
    节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。总结链接如下:重磅消息!《大模型面试......
  • AI工具,完全免费!整理大集合,满满干货分享
    KimiKimi是一个拥有超大“内存”,支持200万字上下文输入的AI智能助手。它不仅可以阅读大量文本,还能上网搜索信息,与用户进行交流。智能搜索、高效阅读、专业解读文件、整理资料、辅助创作、编程辅助等,这个AI工具可以在日常生活和工作中成为你的得力助手。如果你是学术......
  • 背包问题(01背包与完全背包)
    dp考虑两个方面,包括如何表示状态(维度,属性(min、max、cnt)),如何计算当前状态(状态转移方程)。dp问题的优化一般是对状态转移方程进行等价变形。01背包问题有n个物品和一个容量为V的背包。每个物品有两个属性,包括所占用的体积v以及拥有的价值w,每件物品只能用一次。求背包能装得下的情......
  • 浅析背包问题
    理解递推式(或动态规划转移方程)是解决动态规划问题的关键。如果你对这类问题不太理解,下面我将通过一个简化的例子和逐步解释来帮助你理解如何构建和使用递推式。例子:0/1背包问题问题描述给定一个容量为W的背包和n个物品,每个物品有一个重量w[i]和一个价值v[i]。求......
  • 背包九讲--阅读笔记
    背包九讲很古老的文章,from2007,比我年龄都大。但是确实写得很好。01背包很基础。设\(f[i][j]\)为考虑前\(i\)个物品,背包容量为\(j\)的最大价值。$f[i][j]=max{f[i-1][j],f[i-1][j-w[i]]+c[i]}$考虑可以滚动数组,但更高妙的,是倒序枚举\(j\),即:$f......
  • 代码随想录算法训练营第四十四天|01 背包、动态规划:01背包理论基础(滚动数组)、416. 分
    01背包文档讲解:代码随想录题目链接:46.携带研究材料(第六期模拟笔试)有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 暴力解法:每个物品都有放与不放两种状态......