栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 0/1背包问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 0/1背包问题

编号1234
重量2345
价值3456

背包容量=8.求背包所能装物品的最大价值及物品的编码。

思路:动态规划,在每个阶段的决策中,始终保持当前所完成的决策使得背包的价值是最大的。

dp[i][j]:表示前i个物品能放入背包的价值为j。

// 背包或购物单.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 
#include 
using namespace std;
void find(int i, int j);
int object[5] = { 0 };
int weight[5] = { 0, 2, 3, 4, 5 };
int value[5] = { 0, 3, 4, 5, 6 };
vector>dp(5, vector(9, 0));

int _tmain(int argc, _TCHAR* argv[])
{

	//前i个物品在容量为j的情况下,最大的价值
	for (int i = 1; i < 5; i++)//i表示物品的编号
	{
		for (int j = 1; j < 9; j++)//j表示背包的容量
		{
			if (weight[i] > j)//当前物品的体积大于背包容量
			{
				dp[i][j] = dp[i - 1][j];//当前物品不放,其价值等于放前i-1个物品
			}
			else//放第i个物品,找最大。保证有放第i个物品的空间即j-weight[i],价值dp[][]+value[i]
			{
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
			}
		}
	}
	int ans = dp[4][8];
	
	//回溯求放入背包的物品编码
	cout << "装入背包的物品编号:n";
	find(4, 8);

	return 0;
}

void find(int i, int j)
{
	if (i == 0)
	{
		for (int i = 0; i < 5; i++)
		{
			if (object[i] == 1)
			{
				cout << i<< ' ';
			}
		}
		return;
	}
	if (dp[i][j] == dp[i - 1][j])
	{
		object[i] = 0;
		find(i - 1, j);
	}
	else if (dp[i][j] == dp[i - 1][j - weight[i]] + value[i])
	{
		object[i] = 1;
		find(i - 1, j - weight[i]);
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850068.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号