游戏算法题-背包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/82623178

问题如下

代码如下:

#include<iostream>
using namespace std;

int grid_num;//格子数量
int n;//物品数量
//i0 
int max = 0;
//x 3 5 7 3 0       3 5 7 3 0              0 3 5 7 0
//y 10 5 3 15 10    10 5 3 15 0            0 10 3 14 0
void SolveNum(int *x, int *y,int *best) 
{
	int num = 0;
	int value = 0;
	int * s = new int[n];
	int * r = new int[n];

	for (int i = 0; i < n; i++)
	{ 
		s[i] = x[i]; r[i] = y[i]; 
		if (s[i] == 0) r[i] = 0; 
	}

	for (int i = 0; i < n; i++) //处理重复数据
	{
		int idx = s[i];//3
		int val = r[i];//10
		for (int j = i+1; j < n; j++)
		{
			int idx2 = s[j];
			int val2 = r[i];
			if (idx == idx2&&val >= val2) {s[j] = 0; r[j] = 0;}
			else if (idx == idx2&&val < val2) { s[i] = 0; r[i] = 0; }
		}
	}
	
	for (int i = 0; i < n; i++) num += r[i];
	if (num > max) 
	{ 
		max = num; 
		for (int i = 0; i < n; i++) best[i] = s[i];
	}

}
void BestSolution(int *grid, int *items, int ** item_index,int* items_grid_num,int i,int *best)
{
	if (i == n)//所有物品都放入一次了
	{
		SolveNum(grid,items,best);
		return;
	}
	for (int j = 0; j <= items_grid_num[i]; j++)
	{
		int grid_index = item_index[i][j];
		grid[i] = grid_index;
		BestSolution(grid, items, item_index, items_grid_num, i + 1, best);
	}
}

int main()
{
	cin >> grid_num;
	int* grid = new int[grid_num];//格子内的情况(存物品放入下标)
	cin >> n;
	int* items = new int[n];//设置物品价值
	int* items_grid_num = new int[n];// 物品可放入格子数量
	int** item_index = new int*[n];
	for (int i = 0; i < n; i++)
	{
		item_index[i] = new int[grid_num + 1];
		memset(item_index[i], 0, sizeof(int)*(grid_num + 1));//+1 因为下标为0用于表示不放入情况
	}
	for (int i = 0; i < n; i++)
	{
		int a; cin >> a;
		items_grid_num[i] = a;//设置物品放入格子数量
		int value; cin >> value;
		items[i] = value;//设置物品价值
		for (int j = 1; j <= a; j++)
		{
			int grid_index; cin >> grid_index;
			item_index[i][j] = grid_index;//设置能放入的格子 
		}
	}
	int *best = new int[n];
	BestSolution(grid, items, item_index, items_grid_num, 0, best);
	cout << "最大价值为:" << max << endl;
	cout << "序列为:";
	for (int i = 0; i < n; i++) 
	{
		cout << best[i] << "\t";
	}
	cout << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/iceSony/article/details/82623178