动态规划之二见完全背包问题
题目:
有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
f[i][v]=max{ f[i-1][v-k*c[i]]+k*w[i] | 0<=k*c[i]<=v}
O(VN)的算法
这个算法使用一维数组,先看伪代码:
for i=1..N
forv=0..V
f[v]=max{f[v],f[v-cost]+weight}
你会发现,这个伪代码与0-1背包的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么P01中要按照v=V..0的逆序来循环。这是因为要保证第i次循环中的状态f[i][v]是由状态f[i-1][v-c[i]]递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的子结果f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就可以并且必须采用v=0..V的顺序循环。这就是这个简单的程序为何成立的道理。
f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}
v1,v2,…, vn
w1,w2,…, wn
其中所有的wi均为整数。每件物品都有无穷多个。现有一个背包,其最大载重量为m,要求从这n件物品中任取若干件。问背包中装入哪些物品可使得所装物品的价值和最大?
例如,m=10, n = 6,
value weig
10 6
6 3
5 2
10 5
2 1
16 6
8 4
#include <iostream>
#include <string.h>
using namespace std;int space,num;
int weig[31];
int value[31];
int path[31][31];
int bag[31][1001]; //标号为0不用 void fillbag()
{for(int i = 1; i<num+1; i++){for(int j = 1; j <= space; j++){bag[i][j] = bag[i-1][j];if( (j>=weig[i]) && ( (value[i] + bag[i][j-weig[i]]) > bag[i-1][j] )){bag[i][j] = value[i] + bag[i][j-weig[i]];path[i][j] = 1;}}}
}void showbag_path()
{for(int i = 1; i<num+1; i++){for(int j = 1; j<space+1; j++){cout<<"\t"<<bag[i][j];}cout<<endl;}cout<<endl<<endl<<endl;for(int i = 1; i<num+1; i++){for(int j = 1; j<space+1; j++){cout<<"\t"<<path[i][j];}cout<<endl;}
}int main() {cin>>space>>num;memset(weig, 0, sizeof(weig));memset(bag, 0, sizeof(bag));for(int i = 1; i<=num; i++){cin>>value[i];cin>>weig[i];}fillbag(); cout<<endl<<"max value:"<<bag[num][space]<<endl;//找到最佳解的选择方案 int j = space;for(int i = num; i>0 && j>0; ){if(path[i][j] == 1){path[i][0] ++;j -= weig[i];}else{i--;}}//输出最佳解的选择方案 for(int i = 0; i<=num; i++){cout<<"物品"<<i<<":"<<path[i][0]<<" ";}cout<<endl;//输出过程 showbag_path();return 0;
}
动态规划之二见完全背包问题相关推荐
- 动态规划的用法——01背包问题
动态规划的用法--01背包问题 问题主题:著名的01背包问题 问题描述: 有n个重量和价值分别为wi.vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案中的价值最大值. 限制条件: ...
- 【动态规划】0/1背包问题
问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec 内存限制: 64 MB 提交: 152 解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...
- 动态规划——物品无限的背包问题
动态规划--物品无限的背包问题 物品无限的背包问题.有nn种物品,每种均有无穷多个.第i种物品的体积为ViV_i,重量为WiW_i.选一些物品装到一个容量为CC的背包中,使得背包内物品在总体积不超过C ...
- 【动态规划】P1048 01背包问题:采药
时间对应容量,用01背包 [动态规划笔记]01背包问题及优化_m0_52043808的博客-CSDN博客 代码: #include<iostream> using namespace st ...
- vs2017\vs2019 动态规划算法实现0-1背包问题 C
这是针对于博客vs2017安装和使用教程(详细)和vs2019安装和使用教程(详细)的动态规划算法实现0-1背包问题的示例 目录 一.问题描述
- 动态规划:关于01背包问题 I
动态规划:关于01背包问题,你该了解这些! 对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包. 如果这几种背包,分不清,我这里画了一个图,如下: 至于背包九讲其其他背包, ...
- 编程实现背包的递归和非递归两种解法_算法动态规划(七)背包问题4
⚠️今天继续我们来探讨背包问题中的完全背包问题.完全背包:N个物品,容量为V,每个物品可以无限次使用,求达到V的最值. ???今日练习(一)零钱兑换(LeetCode-322).给定一批硬币coins ...
- 动态规划经典问题:背包问题
01背包问题 例: 求背包物品最大总价值 动态规划: 一.二维dp数组 dp数组:dp[i][j]:表示从第一个到第i个物品任意取,背包可以装的重量为j,背包可以装的最大总价值 状态转移方程: dp[ ...
- python动态规划01背包_01背包问题(动态规划)python实现
在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题,使用动态规划来解决.n=5是物品的数量,c ...
最新文章
- zw版【转发·台湾nvp系列Delphi例程】HALCON HSerializedItem
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别
- LevelDB 源码剖析(三)公共基础:内存管理、数值编码、Env家族、文件操作
- python主线程执行_在Django vi中的主线程中执行Python函数
- UVA355 UVALive5249 The Bases Are Loaded【进制】
- webpack 了解
- DBeaverEE for Mac(数据库管理工具)v21.2.1中文版
- python运维是什么_什么是python自动化运维?
- TCP/UDP数据包最大传输MTU
- Java 的三种 Base64
- 探索肠道细菌的营养偏好
- MacOS 显示隐藏文件快捷键
- Ubiquitous Religions 并查集
- 初识二维码 第十八讲 编码转换
- 【夜读】一个人最积极的生活状态
- 【Python】MD5批量修改
- 积微成巨(1)--collect
- Azure考试认证经验
- ArtFin艺术飯+「雅贡臻品」与版权猫IP猫ipmall登陆台北!AiHi@HiFi++
- VirtualBox下载安装