二维费用的背包问题

luogu P1507 NASA的食物计划

题目背景

NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安

全技术问题一直大伤脑筋,因此在各方压力下终止了航天

飞机的历史,但是此类事情会不会在以后发生,谁也无法

保证,在遇到这类航天问题时,解决方法也许只能让航天

员出仓维修,但是多次的维修会消耗航天员大量的能量,

因此NASA便想设计一种食品方案,让体积和承重有限的

条件下多装载一些高卡路里的食物.

思想:多出一个限制条件就增加一维数组

#include<iostream>
#include<cstdio>
using namespace std;
int f[51][401][401],w[401],u[401],k[401];//W是体积,u是质量,k是卡路里 
int main()
{
    int v,m,n;
    scanf("%d%d%d",&v,&m,&n);//v是体积,m是质量 
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d%d",w+i,u+i,k+i);
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=v;++j)
        {
            for(int q=1;q<=m;++q)
            {
                if(q>=u[i])
                {
                    if(j>=w[i])
                    {
                        f[i][j][q]=max(f[i-1][j][q],f[i-1][j-w[i]][q-u[i]]+k[i]);
                    }
                    else
                    {
                        f[i][j][q]=f[i-1][j][q];
                    }
                }
                else
                {
                    f[i][j][q]=f[i-1][j][q];
                }
            }
        }
    }
    cout<<f[n][v][m];
}

另一种解法  压维打击

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[401][401],w[401],u[401],k[401];
int main()
{
    int v,m,n;
    scanf("%d%d%d",&v,&m,&n);//v是体积,m是质量 
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d%d",w+i,u+i,k+i);
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=v;j>=w[i];--j)
        {
            for(int q=m;q>=u[i];--q)
            {
                f[j][q]=max(f[j][q],f[j-w[i]][q-u[i]]+k[i]);
            }
        }
    }
    cout<<f[v][m];
}
原文地址:https://www.cnblogs.com/tpgzy/p/8919983.html