xynu NASA的食物计划(01背包)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 02:50   11   0

问题 B: NASA的食物计划

时间限制: 1 Sec 内存限制: 128 MB
提交: 8 解决: 8
[提交][状态][讨论版]

题目描述

航天飞机的体积有限,当然如果载过重的物品,燃料会浪费很多钱,每件食品都有各自的体积、质量以及所含卡路里,在告诉你体积和质量的最大值的情况下,请输出能达到的食品方案所含卡路里的最大值,当然每个食品只能使用一次.

输入

第一行两个数体积最大值(<400)和质量最大值(<400)

第二行 一个数 食品总数N(<50).

第三行-第3+N行

每行三个数 体积(<400) 质量(<400) 所含卡路里(<500)

输出

一个数 所能达到的最大卡路里(int范围内)

样例输入

320 3504160 40 12080 110 240220 70 31040 400 22

样例输出

550

刚开始写成了这样,结果是错的

for(int i=1;i<=n;i++)
  for(int j=t,k=w;j>=a[i]&&k>=b[i];j--,k--)
   dp[j][k]=max(dp[j][k],dp[j-a[i]][k-b[i]]+c[i]);
改正:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[400][400];
int a[55],b[55],c[55];
int t,w;
void Dp(int n){
 memset(dp,0,sizeof(dp));
 for(int i=1;i<=n;i++)
  for(int j=t;j>=0;j--)
   for(int k=w;k>=0;k--)
  if(j>=a[i]&&k>=b[i]) dp[j][k]=max(dp[j][k],dp[j-a[i]][k-b[i]]+c[i]);
}
int main()
{
 int n;
 scanf("%d%d",&t,&w);
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
 scanf("%d%d%d",&a[i],&b[i],&c[i]);
 Dp(n);
 printf("%d\n",dp[t][w]);
 return 0;
}
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP