c++实现游戏算法--01背包问题

本博客参考了https://blog.csdn.net/mu399/article/details/7722810

题目描述如下: 假设山洞里共有a,b,c,d ,e这5件宝物(不是5种宝物),它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包, 怎么装背包,可以才能带走最多的财富。

01背包问题是典型的动态规划问题,动态规划一般用来解决最优解问题。动态规划的核心思想是:
将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,上一阶段与下一阶段又存在着联系。通过决策丢弃没可能达到最优解的局部解,最终得到最优解

实现代码如下:

//01背包问题
#include "pch.h"
#include 
using namespace std;

//五件物品分别的价值
int value[5] = {1,3,2,4,5};
//五件物品分别的重量
int Weight[5] = { 1,2,2,5,4 };
int BackpackWeight = 10;
int goodscount = sizeof(Weight) / sizeof(Weight[0]);
//构建物品选择关系数组;
//例如a[4][10] 代表只有4号物品 且背包剩余空间为10的能获得的最大价值
void SetPackRelationArr(int arr[][11],int wei[],int val[],int count) 
{
	//以最后一件物品为选择的开始
	//先将最后一件物体放入背包,再根据现有的关系数组推理出整个数组
	for (int pwei = 0; pwei <= BackpackWeight; pwei++) 
	{
		if (pwei < wei[count - 1]) 
		{
			arr[count - 1][pwei] = 0;
		}
		else
		{
			arr[count - 1][pwei] = val[count - 1];
		}

	}
	//计算出是否选择其他物品的值
	for (int  c = count-2; c >= 0; c--)
	{
		for (int pwei = 0; pwei <= BackpackWeight; pwei++)
		{
			if (pwei < wei[c]) 
			{
				arr[c][pwei] = arr[c + 1][pwei];
			}
			else
			{
				//举个例子,如果只装倒数第一个物品的价值要比先装了倒数第二个物品再考虑是否能再装倒数第一个物品的值要高的话
				if (arr[c + 1][pwei] > arr[c][pwei - wei[c]] + val[c]) 
				{
					//选择情况1
					arr[c][pwei] = arr[c + 1][pwei];
				}
				else
				{
					//选择情况2
					arr[c][pwei] = arr[c][pwei - wei[c]] + val[c];
				}
			}
		}
	}
}
//获得结果列表
int* Getlist(int arr[][11],int count) 
{
	int *result = new int[count];
	int pwei = BackpackWeight;
	for (int i = 0; i < count-1; i++) 
	{
		//当只有i和有i和i+1的值相等时,说明没有选择i
		if (arr[i][pwei] == arr[i + 1][pwei]) 
		{
			result[i] = 0;
		}
		else
		{
			result[i] = 1;
			pwei -= Weight[i];
		}
	}
	//判断剩余空间能够否装下最后一个物品
	if (arr[count - 1][pwei] == 0) 
	{
		result[count - 1] = 0;
	}
	else
	{
		result[count - 1] = 1;
	}
	return result;
}

int main()
{
	int arr[5][11] = { 0 };
	SetPackRelationArr(arr, Weight, value, goodscount);
	int *r = Getlist(arr, goodscount);

	for (int i = 0; i < goodscount; i++) 
	{
		cout << r[i] << " ";
	}
}



你可能感兴趣的:(算法)