0
点赞
收藏
分享

微信扫一扫

P1507 NASA的食物计划 题解

秀儿2020 2022-02-12 阅读 69

01背包问题,但是有两个变量体积(vol)和质量(m)
我们知道,一个变量的01背包大概是这么写的(随便举的例子):


for(int i=1;i<=n;i++)
{
  for(int j=v;j>=vol;j--)
  {
    dp[j]=max(dp[j],dp[j-vol]+val);
  }
}


仿照这个代码可以写成:


for (ll j = maxv; j >= fd.vol; j--)
            {
                for (ll k = maxm; k >= fd.m; k--)
                {
                    dp[k][j] = max(dp[k][j], dp[k - fd.m][j - fd.vol] + fd.k);
                }
            }


下面是完整的代码。看标注应该能懂了。
 


#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;

ll dp[500][500];

struct node
{
    ll vol, m, k;//体积,重量,卡路里

}fd;//food

int main()
{
    ll maxv, maxm;
    scanf("%lld %lld", &maxv, &maxm);//最大体积,最大质量
    ll n;
    scanf("%lld", &n);
    while (n--)
    {
        scanf("%lld %lld %lld", &fd.vol, &fd.m, &fd.k);
        
            for (ll j = maxv; j >= fd.vol; j--)
            {
                for (ll k = maxm; k >= fd.m; k--)
                {
                    dp[k][j] = max(dp[k][j], dp[k - fd.m][j - fd.vol] + fd.k);
                }
            }
        
    }
    printf("%lld", dp[maxm][maxv]);
    return 0;
}

举报

相关推荐

0 条评论