NASA的食物计划

NASA的食物计划

题目传送门

题目告诉我们要在体积和重量都不超过的情况下输出最大卡路里,稍微思考一下就可以发现这题是一道01背包的变形题(01背包不会的点这里)。

并且01背包需要空间优化。

那我们就照dp的角度去想

动态转移方程

\[dp[i][j]表示使用质量为i,体积为j时的最大卡路里 \]

\[dp[i][j]=max(dp[i][j],dp[i-z][j-t]+kj) \]

\[方程中z为质量,t为体积,kj为卡路里 \]

蒟蒻不会英文

注意,由于是01背包所以质量和体积要从大到小循环

#include<bits/stdc++.h>
using namespace std;

struct node
{
    int kj,z,t;//从左到右依次为:食物的卡路里、质量、体积
}food[600];

int n,z,t;
int dp[5000][5000];//dp数组

int main()
{
    scanf("%d%d",&t,&z);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&food[i].t,&food[i].z,&food[i].kj);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=z;j>=food[i].z;j--)//循环质量
        {
            for(int k=t;k>=food[i].t;k--)//循环体积
            {
                dp[j][k]=max(dp[j][k],dp[j-food[i].z][k-food[i].t]+food[i].kj);//方程
            }
        }
    }
    printf("%d",dp[z][t]);
}
posted @ 2022-05-07 19:25  彬彬冰激凌  阅读(43)  评论(0)    收藏  举报