此题为限定质量和体积情况下,求反应堆中能够产生的最大能量。
实质上是一个二维0-1背包问题,利用动态规划求解。
/**
*Copyright @ 2019 Zhang Peng. All Right Reserved.
*Filename:
*Author: Zhang Peng
*Date:
*Version:
*Description:
**/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass, int *volumes, int *messes, int *energies)
{
vector<vector<int >> dp(reactorCap + 1, vector<int >(criticalMass + 1, 0));
//int ** dp = new int*[reactorCap + 1];
//for (int i = 0; i < reactorCap + 1; i++)
//{
// dp[i] = new int[criticalMass + 1];
// for (int j = 0; j < criticalMass + 1; j++)
// dp[i][j] = 0;
// //memset(dp[i], 0, sizeof(dp)*(criticalMass + 1));
//}
for (int i = 0; i < numberOfRadLiquid; i++)
for (int j = reactorCap; j >= volumes[i]; j--)
for (int k = criticalMass; k >= messes[i]; k--)
dp[j][k] = max(dp[j][k], dp[j - volumes[i]][k - messes[i]] + energies[i]);
int result = dp[reactorCap][criticalMass];
return result;
}
int main() {
int v = 100, q = 15, m = 5; //v 最大体积 q最大质量 m物品数量
//vol 存放各个物品的体积 qua存放各个物品的质量 value存放各个物品的价值
int vol[55] = { 50,40,30,20,10}, qua[55] = { 1,2,3,9,5}, value[55] = { 300,480,270,200,180 };
std::cout << "最大价值: " << maxEnergyGenerate(v,m,q,vol,qua,value) << std::endl;
system("pause");
return 0;
}