2.维克多

维克多博士创造了一个裂变反应堆,可取用处于液体状态的放射性物质,反应堆的容量是V加仑。他有N瓶的放射性液体,每个都有一定的质量和一定的体积。当液体倒入反应堆时,也产生一些单位的能量。现在,维克多想要将能量输出最大化。但是,有一个限制条件。他研究了原子元素的物理知识和历史,认识到反应堆内放射性液体的总量不能超过特定的临界质量M,否则反应就会失控,并引发剧烈的爆炸。
写一个算法,帮助他从反应堆获得最大的能量,而不会让他丢掉性命。

输入
该函数/方法的输入包括六个参数——
reactorCap,一个整数,表示反应堆的容量(V);
numberOfRadLiquid,一个整数,表示现有小瓶的数量(N);
criticalMass,一个整数,表示反应堆的最大临界值(M);
volumes,一个整数列表,按顺序表示N份放射性液体的体积;
masses,一个整数列表,按顺序表示N份放射性液体的质量;
energies,一个整数列表,按顺序表示N份放射性液体产生的能量。

输出
返回一个整数,表示可在给定的约束条件下从反应堆中产生的最大能量。

约束条件
1≤numberOfRadLiquid≤10^4

示例
输入:
reactorCap=100
numberOfRadLiquid=5
criticalMass=15
volumes=[50,40,30,20,10]
masses=[1,2,3,9,5]
energies=[300,480,270,200,180]

输出:
960

解释:
通过选择1、2、5号瓶中的液体,产生的能量=300+480+180=960。
这种液体组合产生的总体积=50+40+10=100,不大于reactorCap,造成反应堆中的总质量=1+2+5=8,不大于criticalMass。

//INCLUDE HEADER FILES NEEDED BY YOUR PROGRAM
//SOME LIBRARY FUNCIONALITY MAY BE RESTRICTED
//DEFINE ANY FUNCTION NEEDED
//FUNCTION SIGNATURE BEGINS,THIS FUNCTION IS REQUIRED
int maxEnergyGenerate(int reactorCap,int numberOfRadLiquid,int criticalMass,int* volumes,int* masses,int* energies)
{
//WRITE YOUR CODE HERE
}
//FUNCTION SIGNATURE ENDS

回答:
李yc版本(用以下代码覆盖掉已给代码)
#include
#include
#include
using namespace std;
// 求排列组合算法: C(n, m): 从n个数中任选m个数组成一个新的数, 求有多少种组合, 分别是什么
// 从v[]里任选m个元素组成一个组合, 与顺序无关
template
vector<vector> fun(vector v, int m)
{
if (v.size() < m)
return{}; // 找不到这样的组合
vector<vector> ret;
if (v.size() == m) // v[]中任选m个数
{
ret.push_back(v); // 唯一的一个组合
return ret;
}
else if (m == 1) // v[]中任选1个数
{
for (auto& it : v)
{
ret.push_back(vector {it});
}
return ret;
}
while (v.size() >= m)
{
auto first = v.front();
v.erase(v.begin());
// 在剩下的v[1~]中任选m-1个数
auto res = fun(v, m - 1);
for (auto& it : res)
{
it.insert(it.begin(), first);
ret.push_back(it);
}
}
return ret;
}
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass,
int *volumes, int *masses, int *energies)
{
int sum_energies = 0;
std::vector v = {};//每个瓶子编号
for (int i = 0; i < numberOfRadLiquid; i++)
v.push_back(i + 1);
for (int i = numberOfRadLiquid; i >= 1; i–)
{
auto res = fun(v, i);
int sum_energies_i = 0;
int sum_masses = 0;
int sum_volumes = 0;
for (auto& it : res)
{
sum_volumes = 0;
sum_masses = 0;
sum_energies_i = 0;
for (auto& it2 : it)
{
sum_volumes = volumes[it2 - 1] + sum_volumes;
sum_masses = masses[it2 - 1] + sum_masses;
sum_energies_i = energies[it2 - 1] + sum_energies_i;
}
if (sum_volumes <= reactorCap && sum_masses <= criticalMass && sum_energies_i > sum_energies)
{
sum_energies = sum_energies_i;
}
}
}
return sum_energies;
}

李yc版本:(改掉变量名的)
#include “pch.h”
#include
#include
#include
using namespace std;
// 求排列组合算法: C(n, m): 从n个数中任选m个数组成一个新的数, 求有多少种组合, 分别是什么
// 从v[]里任选m个元素组成一个组合, 与顺序无关
template
vector<vector> fun(vector v, int m)
{
if (v.size() < m)
return{}; // 找不到这样的组合
vector<vector> ret;
if (v.size() == m) // v[]中任选m个数
{
ret.push_back(v); // 唯一的一个组合
return ret;
}
else if (m == 1) // v[]中任选1个数
{
for (auto& it : v)
{
ret.push_back(vector {it});
}
return ret;
}
while (v.size() >= m)
{
auto first = v.front();
v.erase(v.begin());
// 在剩下的v[1~]中任选m-1个数
auto res = fun(v, m - 1);
for (auto& it : res)
{
it.insert(it.begin(), first);
ret.push_back(it);
}
}
return ret;
}
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass,
int *volumes, int *masses, int *energies)
{
int sum_energies = 0;
std::vector v = {};//每个瓶子编号
for (int i = 0; i < numberOfRadLiquid; i++)
v.push_back(i + 1);
for (int i = numberOfRadLiquid; i >= 1; i–)
{
auto res = fun(v, i);
int sum_energies_i = 0;
int sum_masses = 0;
int sum_volumes = 0;
for (auto& it : res)
{
sum_volumes = 0;
sum_masses = 0;
sum_energies_i = 0;
for (auto& it2 : it)
{
sum_volumes = volumes[it2 - 1] + sum_volumes;
sum_masses = masses[it2 - 1] + sum_masses;
sum_energies_i = energies[it2 - 1] + sum_energies_i;
}
if (sum_volumes <= reactorCap && sum_masses <= criticalMass && sum_energies_i > sum_energies)
{
sum_energies = sum_energies_i;
}
}
}
return sum_energies;
}
int main()
{
int reactorCap = 250;//容量50
int numberOfRadLiquid = 5;//个数
int criticalMass = 25;//临界质量
int volumes[5] = { 30, 40, 50, 60, 70 };//体积
int masses[5] = { 7, 8, 9, 10, 11 };//质量
int energies[5] = { 300, 400, 500, 600, 700 };//能量
int sum_energies = maxEnergyGenerate(reactorCap, numberOfRadLiquid,criticalMass,
volumes, masses, energies);
cout << sum_energies << endl;
return 0;
}

汪px版本:
#include “pch.h”
#include
#include
#include
using namespace std;
// 求排列组合算法: C(n, m): 从n个数中任选m个数组成一个新的数, 求有多少种组合, 分别是什么
// 从v[]里任选m个元素组成一个组合, 与顺序无关
template
vector<vector> fun(vector v, int m)
{
if (v.size() < m)
return{}; // 找不到这样的组合
vector<vector> ret;
if (v.size() == m) // v[]中任选m个数
{
ret.push_back(v); // 唯一的一个组合
return ret;
}
else if (m == 1) // v[]中任选1个数
{
for (auto& it : v)
{
ret.push_back(vector {it});
}
return ret;
}
while (v.size() >= m)
{
auto first = v.front();
v.erase(v.begin());
// 在剩下的v[1~]中任选m-1个数
auto res = fun(v, m - 1);
for (auto& it : res)
{
it.insert(it.begin(), first);
ret.push_back(it);
}
}
return ret;
}
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass,
int *volumes, int *masses, int *energies)
{
int sum_energies = 0;
std::vector v = {};//每个瓶子编号
for (int i = 0; i < numberOfRadLiquid; i++)
v.push_back(i + 1);
for (int i = numberOfRadLiquid; i >= 1; i–)
{
auto res = fun(v, i);
int sum_energies_i = 0;
int sum_masses = 0;
int sum_volumes = 0;
for (auto& it : res)
{
sum_volumes = 0;
sum_masses = 0;
sum_energies_i = 0;
for (auto& it2 : it)
{
sum_volumes = volumes[it2 - 1] + sum_volumes;
sum_masses = masses[it2 - 1] + sum_masses;
sum_energies_i = energies[it2 - 1] + sum_energies_i;
}
if (sum_volumes <= reactorCap && sum_masses <= criticalMass && sum_energies_i > sum_energies)
{
sum_energies = sum_energies_i;
}
}
}
return sum_energies;
}
int main()
{
int reactorCap = 250;//容量50
int numberOfRadLiquid = 5;//个数
int criticalMass = 25;//临界质量
int volumes[5] = { 30, 40, 50, 60, 70 };//体积
int masses[5] = { 7, 8, 9, 10, 11 };//质量
int energies[5] = { 300, 400, 500, 600, 700 };//能量
int sum_energies = maxEnergyGenerate(reactorCap, numberOfRadLiquid,criticalMass,
volumes, masses, energies);
cout << sum_energies << endl;
return 0;
}

黄yx版本:
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass, int *volumes, int *masses, int *energies)
{
 float k = reactorCap / criticalMass;
 vector massRate;
 vector volumesRate;
 vector finalRate;
 vector list;
 for (int i = 0; i < numberOfRadLiquid; i++)
 {
  massRate.push_back(energies[i] / masses[i]);
  volumesRate.push_back(energies[i] / volumes[i]);
  finalRate.push_back(massRate[i] * k + volumesRate[i]);
  list.push_back(-1);
 }
 vector finalRateSort(finalRate);
 for (int i = 0; i < numberOfRadLiquid; i++)
 {
  double max = 0;
  for (int j = 0; j < numberOfRadLiquid; j++)
  {
   if (max < finalRate[j])
   {
    max = finalRate[j];
    finalRateSort[i] = max;
    list[i] = j;
   }
  }
  finalRate[list[i]] = 0;
 }
 int massNow = 0;
 int volNow = 0;
 int maxEn = 0;
 int n = 0;
 while(true)
 {
  if (n == numberOfRadLiquid)
   break;
  volNow += volumes[list[n]];
  if (volNow > reactorCap)
  {
   volNow -= volumes[list[n]];
   n++;
   continue;
  }
  massNow += masses[list[n]];
  if (massNow > criticalMass)
  {
   massNow -= masses[list[n]];
   n++;
   continue;
  }
  maxEn +=energies[list[n]];
  n++;
  if (n == numberOfRadLiquid)
   break;
 }
 return maxEn;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值