Luogu P1507 NASA的食物计划

来源:互联网 发布:富网络应用模式 程序 编辑:程序博客网 时间:2024/04/28 14:50

题目传送门:https://www.luogu.org/problem/show?pid=1507


主要思路:这道题是很简单的记搜,其实就是01背包的变种.
我们可以理解为被01背包多了一个限制.
当我们要求出当前状态所能得到的最多卡路里时,有两种决策:1.带走 2.不带走.
我们要求出选哪种决策的话卡路里高一点.
这么一来状态转移方程就可以出来了:
DP[step][sum_v][sum_t]=max(DP[step+1][sum_v+food[step].v],[sum_t+food[step].t]+food[step].cal,DP[step+1][sum_v][sum_t]);
PS:step是当前到那个物品了,sum_v是体积和,sum_t是质量和.


附上代码:

#include <iostream>#define MAXN 100#define MAXV 500#define MAXT 500#define UNINF -999999using namespace std;struct node{int v,t,cal;}food[MAXN];int dp[MAXN][MAXV][MAXT];int n,max_v,max_t;void init(){int i;cin>>max_v>>max_t>>n;for(i=1;i<=n;i++){cin>>food[i].v>>food[i].t>>food[i].cal;}return;}int search(int step,int sum_v,int sum_t){if(sum_v>max_v || sum_t>max_t){return UNINF;}if(step==n+1){return 0;}if(dp[step][sum_v][sum_t]!=0){return dp[step][sum_v][sum_t];}dp[step][sum_v][sum_t]=max(search(step+1,sum_v+food[step].v,sum_t+food[step].t)+food[step].cal,search(step+1,sum_v,sum_t));return dp[step][sum_v][sum_t];}void out(){cout<<dp[1][0][0];}int main(){init();search(1,0,0);out();return 0;}