数据结构与算法之维克多博士的裂变反应堆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 
#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;
    vectorint>> 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;
}

 

转载于:https://www.cnblogs.com/jxLuTech/p/11377733.html

你可能感兴趣的:(数据结构与算法之维克多博士的裂变反应堆C++)