P2967 [USACO09DEC]Video Game Troubles G
思路
有购买需要的条件、有价格、有价值、求最大价值。不难看出,这是一道有依赖的背包问题。
有依赖的背包问题就是要先把某一个物品取走,才能取后面的某些物品。所以需要对 分背包(每个平台)里的所有物品进行01背包,再用 总背包 (最终结论)对 分背包 进行分组背包得出最优解。
但是此时有一个问题—— TLE 出现了。
有一个结论是显而易见的,就是 总背包 每一次结论都可以得出一个最优的子结构。所以就可以继承之前的最优解进行 一定要购买游戏平台 的决策。既然可以选择用最优解进行背包,何必要重新开始呢?
最后将继承之前的决策与购买新的游戏平台求最优解就好了。
细节
动态规划是有很多细节需要注意的,不是说思路对了就能 AC 。
细节1
每一次的 购买平台决策 所需花费对应着总背包的什么花费?
细节2
对于分背包, V~V-P 的价值可不可能被用到?
思考并明白了以上 做题时的大坑 问题,才算真正明白此题。
#include<bits/stdc++.h>
using namespace std;
int N,gwi,gvi,p,G,V,gdp[111111],dp[111111];
int main() {
scanf("%d%d",&N,&V);
while(N--) {
scanf("%d%d",&p,&G);
for(int i=0;i<=V-p;i++) {
gdp[i]=dp[i];
}
while(G--) {
scanf("%d%d",&gvi,&gwi);
for(int j=V-p;j>=gvi;j--) {
gdp[j]=max(gdp[j],gdp[j-gvi]+gwi);
}
}
for(int i=V;i>=p;i--)
dp[i]=max(dp[i],gdp[i-p]);
}
cout<<dp[V];
return 0;
}
本文作者:cjrqwq
本文链接:https://www.cnblogs.com/yfzqwq/p/18492850
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步