題目描述:
維克多博士創造了一個裂變反應堆,可取用處於液體狀態的放射性物質。反應堆的容量是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 <vector> #include <iostream> #include <algorithm> #include <sstream> 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<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<n; i++) { cout << "Intput volumes:"; cin >> tmp; volumes.push_back(tmp); } for (int i = 0; i<n; i++) { cout << "Intput masses:"; cin >> tmp; masses.push_back(tmp); } for (int i = 0; i<n; 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; }