數據結構與算法之維克多博士的裂變反應堆C++


題目描述:
維克多博士創造了一個裂變反應堆,可取用處於液體狀態的放射性物質。反應堆的容量是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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM