背包系列第四篇----完全背包(求解最大价值)
来源:互联网 发布:程序员考试时间 编辑:程序博客网 时间:2024/05/21 10:38
一:问题
完全背包问题描述:一个容量为V的背包。现在有N种物品,每种物品有无数个,每种物品的体积是C1,C2,…,Cn,对应的每种的价值是W1,W2,…,Wn.。试问,在不超过背包容量的情况下,物品装入背包的最大价值?二:分析
先来看下完全背包和01背包的区别,我们再来看下什么是01背包?
01背包问题描述:一个容量为V的背包。现在有N种物品,每种物品只有一个,每种物品的体积是C1,C2,…,Cn,对应的每种的价值是W1,W2,…,Wn.。试问,在不超过背包容量的情况下,物品装入背包的最大价值?
注意以上两个红字部分,是的,它们的唯一区别就是完全背包每种物品有无数个,而01背包只能有1个。
01背包的时候,对于第i种物品,你只有两种选择,选择0次或者选择1次。
完全背包的时候,对于第i种物品,你可以选择0次,选择1次,选择2次,选择3次,,,,,,
我们来简单看下01背包和完全背包的对比代码:
//01背包for (int i = 1; i <= N; i++) { for (int j = 0; j <= V; j++) { dp[i][j] = dp[i - 1][j];//假设第i个不取 if (j - v[i] >= 0 && dp[i][j] < dp[i - 1][j - v[i]] + w[i])//如果比它大,再取第i个 dp[i][j] = dp[i - 1][j - v[i]] + w[i]; } }
//完全背包for (int i = 1; i <= N; i++){ for (int j = 0; j <= V; j++) { dp[i][j] = dp[i - 1][j];//取0次 if (j - v[i] >= 0 && dp[i][j] < dp[i][j - v[i]] + w[i])//取1次,取2次,,,,, dp[i][j] = dp[i][j - v[i]] + w[i]; }}
不同的地方就是在第7,8行,dp[ i - 1 ][ j - v[ i ] ]与dp[ i ][ j - v[ i ] ],很容易知道dp[ i - 1 ][ j - v[ i ] ]里的第i种物品被选择了0次,而dp[ i ][ j - v[ i ] ]呢,里边可能已经选择了第i种物品。
三:代码
#include<iostream> #include<algorithm> using namespace std;#define N 6#define V 10 //背包容量int w[N + 1] = { 0,2,3,1,4,6,5 }; //6个物品的价值,第一个0除外int v[N + 1] = { 0,5,6,5,1,19,7 }; //6个物品的体积,第一个0除外int dp[N + 5][V + 5];int main(){for (int i = 1; i <= N; i++){for (int j = 0; j <= V; j++){dp[i][j] = dp[i - 1][j];//取0次if (j - v[i] >= 0 && dp[i][j] < dp[i][j - v[i]] + w[i])//取1次,取2次,,,,,dp[i][j] = dp[i][j - v[i]] + w[i];}}printf("最大价值是:%d\n", dp[N][V]);return 0;}
数据测试:
四:算法优化
像01背包那样,dp[ i ][ j ]也是可以优化成dp[ j ]。代码如下:
#include<iostream> #include<algorithm> using namespace std;#define N 6#define V 10 //背包容量int w[N + 1] = { 0,2,3,1,4,6,5 }; //6个物品的价值,第一个0除外int v[N + 1] = { 0,5,6,5,1,19,7 }; //6个物品的体积,第一个0除外int dp[V + 5];int main(){for (int i = 1; i <= N; i++)for (int j = v[i]; j <= V; j++)dp[j] = max(dp[j], dp[j - v[i]] + w[i]);printf("最大价值是:%d\n", dp[V]);return 0;}
细心的读者发现,优化的代码和01背包优化后的代码很相似,是的,读者不妨再把本系列的第一篇文章拿来看看,它们的差别就是:
for ( int j = v[ i ]; j <= V; j++ ) //完全背包优化代码
与
for ( int j = V; j <= v[ i ]; j-- ) //01背包优化代码
这里就留给读者自己思考吧,不难的。
可能读者学到这里感觉已经混乱了,不要着急,如果看了一遍就懂了背包问题,那这也未免太简单了,心急吃不了热豆腐,这些文章多看几遍,多看几遍,多看几遍,自然就懂了,要有耐心!!!
返回背包系列目录--->背包系列目录
- 背包系列第四篇----完全背包(求解最大价值)
- 背包系列第五篇----完全背包(求解最大价值时背包的物品)
- 背包系列第六篇----完全背包(求解最大价值的个数)
- 背包系列第二篇----01背包(求解最大价值时背包的物品)
- 背包系列第三篇----01背包(求解最大价值的个数)
- 完全背包(满且价值最小)
- 最大价值和,多重背包
- HDU_完全背包系列
- 完全背包系列
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现 (包含背包具体物品的求解)
- 背包问题(01背包和完全背包)java求解
- 背包问题(01背包和完全背包)java求解
- hdu1114 Piggy-Bank(完全背包,求最小价值)
- 动态规划实例(七):01背包问题最大价值
- swift2.0 学习笔记five
- 第七章 Delegation and Text Input笔记
- 解决Ubuntu WPS演示全屏闪退(swrast_dri.so: undefined symbol: _glapi_tls_Dispatch)的错误
- 电赛准备
- zookeeper安装与配置
- 背包系列第四篇----完全背包(求解最大价值)
- 设计模式(四)代理模式
- Maven依赖排除 禁止依赖传递 取消依赖的方法 去除jar包中的不想要的依赖关系
- 欧拉函数
- Css简介
- linux基础之 创建一个UDP socket
- unity5.3.3 no pc,mac&linux standalone
- cf273C. Primes on Interval【二分】
- Java 设计模式- 外观模式