题目描述:
维克多博士创造了一个裂变反应堆,可取用处于液体状态的放射性物质。反应堆的容量是V加仑。他有N瓶的放射性液体,每个都有一定的质量和一定的体积。当液体倒入反应堆时,也产生一些单位的能量。现在,维克多想要将能量输出最大化。但是,有一个限制条件。他研究了原子元素的物理知识和历史,认识到反应堆内放射性液体的总量不能超过特定的临界质量M,否则反应就会失控,并引发剧烈的爆炸。写一个算法,帮助他从反应堆获得最大的能量,而不会让他丢掉性命。
输入:
该函数/方法的输入包括六个参数------
reactorCap,一个整数,表示反应堆的容量(V);
numberOfRadLiquid,一个整数,表示现有小瓶的数量(N);
criticalMass,一个整数,表示反应堆的最大临界质量(M);
volumes,一个整数列表,按顺序表示N份放射性液体的体积;
masses,一个整数列表,按顺序表示N份放射性液体的质量;
energies,一个整数列表,按顺序表示N份放射性液体产生的能量。
输出:
返回一个整数,表示可给定的约束条件下从反应堆中产生的最大能量。
示例:
输入:
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.
解析:这是一个典型的01背包问题,直接上代码了,注意判断一下输入是否合理。
#include#include #include #include using namespace std; int maxenergy(int reactorCap, int n, int maxmass, vector<int> vol, vector<int> mass, vector<int> ener) { if (n < 1) return 0; vector int>> dp(maxmass + 1, (vector<int>)(reactorCap + 1)); for (int i = 0; i < n; i++) { for (int j = dp.size()-1; j > 0; j--) { for (int k = dp[j].size()-1; k > 0; k--) { if(vol[i] <= k && mass[i] <=j) dp[j][k] = max(dp[j][k], dp[j - mass[i]][k-vol[i]] + ener[i]); } } } return dp[maxmass][reactorCap]; } int main() { int reactorCap; cout << "Intput reactorCap: "; cin >> reactorCap; int n; cout << "Intput numberOfRadLiquid:"; cin >> n; int maxmass; cout << "Intput maxmass: "; cin >> maxmass; vector<int>volumes; vector<int>masses; vector<int>energies; int tmp = 0; for (int i = 0; i ) { cout << "Intput volumes:"; cin >> tmp; volumes.push_back(tmp); } for (int i = 0; i ) { cout << "Intput masses:"; cin >> tmp; masses.push_back(tmp); } for (int i = 0; i ) { cout << "Intput energies:"; cin >> tmp; energies.push_back(tmp); } int res = maxenergy(reactorCap, n, maxmass, volumes, masses, energies); cout << res << endl; system("pause"); return 0; }