题解:洛谷P1507 NASA的食物计划

作者是只蒟蒻,水平较低,不好勿喷

P1507 NASA的食物计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

从题目分析,在给定最大体积和最大质量的情况下,尽可能多的装下更多的卡路里,显然是一个多重背包的问题,只需要将状态转移方程列出来,就可以轻松解决。

首先设定一个三维数组dp[k][i][j],其中k表示前k个物品,i表示背包现有体积,j表示背包现有质量,将题目中的数据储存到v[100],m[100],kli[100]数组中,m表示每一个物品的质量,v表示每一个物品的体积,kli表示每一个物品的卡路里。

接下来列出状态转移方程: 

if (j >= b[k] && i >= a[k]) 
	dp[k][i][j] = max(dp[k-1][i - m[k]][j - v[k]] + kli[k], dp[k - 1][i][j]);
else
	dp[k][i][j] = dp[k-1][i][j];

(不太会公式,就用代码表示了)

然后循环每一个物品,体积和质量的每一个状态,最后输出dp[k][i][j]就可以了

下面是源代码:

#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;

int n[51], m[51], kli[51];
int dp[51][500][500];//注意不要将体积和质量设置太大,不然空间会爆炸

int main() {
	int i, j, k, n, m;
	int h, t;
	cin >> h >> t >> n;//输入最大体积,质量和食品的数目
	for (i = 1;i <= n;i++)
		cin >> v[i] >> m[i] >> kli[i];//获取每一个食品的体积,质量和卡路里
	for (k = 1;k <= n;k++)
		for (i = h;i >= 0;i--)
			for (j = t;j >= 0;j--) {
                if (j >= b[k] && i >= a[k]) //保证体积和质量不会超过背包
	                dp[k][i][j] = max(dp[k-1][i - v[k]][j - m[k]] + kli[k], dp[k - 1][i][j]);
                else
	                dp[k][i][j] = dp[k-1][i][j];
			}
	cout << dp[n][h][t];
	return 0;
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值