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 中国大陆许可协议进行许可。

posted @   cjrqwq  阅读(6)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
展开
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.