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]);
}

浙公网安备 33010602011771号