动态规划之'01背包'

本文详细介绍了01背包问题,这是一种基础的背包问题,每件物品仅有一件,可以选择放或不放。核心是通过状态转移方程找到使物品价值总和最大的方案。状态转移方程为f[i][v] = max(f[i-1][v-weight[i]] + value[i], f[i-1][v]),其中f[i][v]表示前i件物品放入容量为v的背包能获得的最大价值。文章提供了样题和不同实现方式,包括一维和二维数组的解法,并强调了物品重量为0但可能有价值的情况。" 88399023,8386698,CentOS 7上单机部署solr 6.6.5详步骤,"['Linux', 'solr', 'Java']
摘要由CSDN通过智能技术生成

致敬前辈!参考网址:
https://blog.csdn.net/qq_38410730/article/details/81667885

状态转移方程:

if (背包体积j小于物品i的体积)
    f[i][j] = f[i-1][j] //背包装不下第i个物体,目前只能靠前i-1个物体装包
else
    f[i][j] = max(f[i-1][j], f[i-1][j-Vi] + Wi)

问题描述:

有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

基本思路 :
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:tab[i][j] = max(tab[i-1][j-weight[i]]+value[i],tab[i-1][j]) ({i,j|0<i<=n,0<=j<=total})

其中i表示放第i个物品,j表示背包所容纳的重量,那么tab[i-1][j-weight[i]]+value[i]表示放入第i物品,刚开始接触会有疑问,tab[i-1][j-weight[i]]这个值,可以这样理解:tab[i-1][j]为装到上一个物品在背包j容量时的最佳值,那么如果我要求在j容量的时候放入现在的i物品的价值,那么是不是要先得到容量为(j-weight[i])时候的价值,即先得到 tab[i-1][j-weight[i]] ,所以 tab[i-1][j-weight[i]]+value[i] 为放入第i物品的价值; tab[i-1][j] 就是不放入第i个物品。

#include<iostream>
using namespace std;
#include <algorithm>
 
int main()
{
   
	int w[5] = {
    0 , 2 , 3 , 4 , 5 };			//商品的体积2、3、4、5
	int v[5] = {
    0 , 3 , 4 , 5 , 6 };			//商品的价值3、4、5、6
	int bagV = 8;					        //背包大小
	int dp[5][9] = {
    {
    0 } };			        //动态规划表
 
	for (int i = 1; i <= 4; i++) {
   
		for (int j = 1; j <= bagV; j++) {
   
			if (j < w[i])
				dp[i][j] = dp[i - 1][j];
			else
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值