当前位置: 首页 > article >正文

动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)

概览检索
动态规划DP 概览(点击链接跳转)
动态规划DP 背包问题 概览(点击链接跳转)在这里插入图片描述

完全背包问题

原题链接

AcWiing 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

题目分析

完全背包:对于每个物品可以选0,1,2···个(无限件可用)。

闫氏DP分析法

在这里插入图片描述
f [ i , j ] f[i,j] f[i,j] 表示从1~i 个物品中选择且总体积不超过 j 的选法中价值最大的那个。

对于第i个物品,
可以选0个 i,即在 0~i -1 个物品中选择,体积不超过j,即 f [ i − 1 , j ] f[i-1,j] f[i1,j]
可以选1个 i,同时在 0~i -1 个物品中选择,体积不超过 j − v [ i ] j-v[i] jv[i],即 f [ i − 1 , j − v [ i ] ] + w [ i ] f[i-1,j-v[i]]+w[i] f[i1,jv[i]]+w[i]
···
可以选k个 i,同时在 0~i -1 个物品中选择,体积不超过 j − k × v [ i ] j-k \times v[i] jk×v[i],即 f [ i − 1 , j − k × v [ i ] ] + k × w [ i ] f[i-1,j-k \times v[i]]+k \times w[i] f[i1,jk×v[i]]+k×w[i]

其中,k的值由背包总容量决定,要保证 j ≥ k × v [ i ] j\geq k \times v[i] jk×v[i]
k = ⌊ j / v [ i ] ⌋ k=\lfloor j/v[i] \rfloor k=j/v[i]⌋

综上,
f [ i , j ] f[i,j] f[i,j] 即为上述所有结果的最大值。
f [ i , j ] = m a x ( f [ i − 1 , j ] , f [ i − 1 , j − k × v [ i ] ] + k × w [ i ] ) f[i,j]=max(f[i-1,j],f[i-1,j-k \times v[i]]+k \times w[i]) f[i,j]=max(f[i1,j],f[i1,jk×v[i]]+k×w[i])

优化版

观察状态计算公式:
f [ i , j ] = m a x ( f [ i − 1 , j ] , f [ i − 1 , j − v ] + w , f [ i − 1 , j − 2 v ] + 2 w , ⋅ ⋅ ⋅ , f [ i − 1 , j − k v ] + k w ) f[i,j]=max(f[i-1,j],f[i-1,j-v]+w,f[i-1,j-2v]+2w,···,f[i-1,j-kv]+kw) f[i,j]=max(f[i1,j],f[i1,jv]+w,f[i1,j2v]+2w,⋅⋅⋅,f[i1,jkv]+kw)

f [ i , j − v ] = m a x ( f [ i − 1 , j − v ] , f [ i − 1 , j − 2 v ] + w , f [ i − 1 , j − 3 v ] + 2 w , ⋅ ⋅ ⋅ , f [ i − 1 , j − k v ] + ( k − 1 ) w ) f[i,j-v]=max(f[i-1,j-v],f[i-1,j-2v]+w,f[i-1,j-3v]+2w,···,f[i-1,j-kv]+(k-1)w) f[i,jv]=max(f[i1,jv],f[i1,j2v]+w,f[i1,j3v]+2w,⋅⋅⋅,f[i1,jkv]+(k1)w)

对比可得:
在这里插入图片描述

可得,
f [ i , j ] = m a x ( f [ i − 1 , j ] , f [ i , j − v ] + w ] f[i,j]=max(f[i-1,j],f[i,j-v]+w] f[i,j]=max(f[i1,j],f[i,jv]+w]

完整代码

朴素版

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];
int f[N][N];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    //遍历每个物品
    for(int i=1;i<=n;i++)
        for(int j=0;j<=m;j++)
            //选k个第i个物品
            for(int k=0;k<=j/v[i];k++)
                f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
    cout<<f[n][m]<<endl;
    return 0;
}

优化版

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int n,m;
int w[N],v[N];
int f[N][N];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    for(int i=1;i<=n;i++)
        for(int j=0;j<=m;j++){
            f[i][j]=f[i-1][j];
            if(j>=v[i]) f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i]);
        }
    cout<<f[n][m]<<endl;
    return 0;
}

空间优化一维

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];
int f[N];  //一维
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    for(int i=1;i<=n;i++){
        for(int j=v[i];j<=m;j++){
            f[j]=max(f[j],f[j-v[i]]+w[i]);
        }
    }
    cout<<f[m]<<endl;
    return 0;
}

http://www.kler.cn/a/528871.html

相关文章:

  • 分层多维度应急管理系统的设计
  • 新能源算力战争:为什么AI大模型需要绿色数据中心?
  • 吴晓波 历代经济变革得失@简明“中国经济史” - 读书笔记
  • 快速提升网站收录:利用网站分析工具
  • 具身智能体空间感知基础!ROBOSPATIAL:评测并增强2D和3D视觉语言模型空间理解水平
  • 【DeepSeek-V3】AI Model Evaluation Framework and index schedule AI模型能力评价指标及对比
  • 算法【有依赖的背包】
  • 第26节课:内容安全策略(CSP)—构建安全网页的防御盾
  • 【MyDB】4-VersionManager 之 3-死锁及超时检测
  • 3D 对象的属性
  • plot(rrt_path(:, 1), rrt_path(:, 2), ‘b-‘, ‘LineWidth‘, 2); % 蓝色线条表示RRT路径
  • PDCA 循环法
  • 苍穹外卖第一天
  • 【股票数据API接口45】如何获取股票指历史分时MACD数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • (9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同
  • 深入剖析C语言字符串操作函数:my_strlen与my_strcpy
  • 【问题记录】DeepSeek本地部署遇到问题
  • Python-列表
  • HTB:LinkVortex[WriteUP]
  • STM32 AD多通道
  • 一文讲解Java中的ArrayList和LinkedList
  • 【Convex Optimization Stanford】Lec4 CVX-opt-promblem
  • os开发基础知识(1)
  • 计算机视觉:解锁智能时代的钥匙与实战案例
  • .Net WebAPI -[HttpPut(“{fileServiceId:int}“)]
  • 【数据结构】_时间复杂度相关OJ(力扣版)