题解 P1794 【装备运输】
STEP 1 分析题意
首先,这道题告诉你了总体积和总重量,告诉你了每个物品的价值的重量以及体积。这不就是01背包的进阶版吗!
01背包是什么?用数组记录最佳情况,再考虑放与不放的问题。所以这道题虽然多了一个条件,也只是相当与数组要多开一维而已。依然用滚动数组搞定即可。
但是注意:枚举体积和重量的时候,一定要倒着枚举!因为一个物品只能被放入一次!当然,如果是完全背包的话,是从头枚举的!切记!切记!切记!重要的事情说三遍!
STEP 2 AC代码及注释
#include<bits/stdc++.h>//万能头文件
using namespace std;
int v,g,n,dp[501][501],h[501],t[501],z[501];//v,g,n如题所示,dp数组记录动规结果,第一维记录体积,第二维记录重量,h,t,z三个数组分别记录每个物品的体积重量和火力值
int main(){
scanf("%d %d\n%d",&v,&g,&n);
for (int i=1;i<=n;i++){
scanf("%d %d %d",&h[i],&t[i],&z[i]);
}//正常输入
for (int x=1;x<=n;x++){
for (int i=v;i>=t[x];i--){
for (int j=g;j>=z[x];j--){//体积和重量要倒着枚举,防止物品重复放入
dp[i][j]=max(dp[i-t[x]][j-z[x]]+h[x],dp[i][j]);//动规转移方程
}
}
}
printf("%d\n",dp[v][g]);//输出当体积和重量为最大值时的火力值最大的结果
return 0;//好习惯人人养
}
STEP 3 完结撒花!
看了我的题解,如果还有什么不懂的地方,欢迎在评论区留言哦,我会第一时间回复的。如果都懂了,就点个赞纪念一下你的点滴成长吧!