版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}