作者是只蒟蒻,水平较低,不好勿喷
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;
}