bzoj4457: 游戏任务--双层01背包

这题和NOIP的金明的预算方案(?)很像,只不过附件的数量增多了

如果对主件进行一次01背包,再套一层附件的01背包O(n4)肯定会爆。。

所以我们可以先预处理出,对于每个主件,花的时间为k的情况下,最大的经验值,用01背包做

然后再对每个主件进行01背包,这样就去掉了一层循环

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define maxn 102
 5 using namespace std;
 6 long long n[maxn*5],v[maxn][maxn*5],c[maxn][maxn*5],t[maxn][maxn*5],f[maxn*5];
 7 int N,T;
 8 int main(){
 9     scanf("%d%d", &N, &T);
10     for (int i=1; i<=N; i++){
11         scanf("%lld%lld%lld", &n[i], &v[i][0], &c[i][0]);
12         for (int j=1; j<=n[i]; j++)
13             scanf("%lld%lld", &v[i][j], &c[i][j]);
14     }
15     memset(t,0,sizeof(t));
16     memset(f,0,sizeof(f));
17     for (int i=1; i<=N; i++){
18         for (int k=T; k>=v[i][0]; k--)
19             t[i][k]=c[i][0];
20         for (int j=1; j<=n[i]; j++)
21             for (int k=T; k>=v[i][0]+v[i][j]; k--)
22                 t[i][k]=max(t[i][k],t[i][k-v[i][j]]+c[i][j]);  //第i个主件,k时间能拿到的最大经验值
23     }
24     for (int i=1; i<=N; i++)
25         for (int j=T; j>=v[i][0]; j--)
26             for (int k=j; k>=0; k--)
27                 f[j]=max(f[j],f[j-k]+t[i][k]);
28     printf("%lld\n", f[T]);
29     return 0;
30 }
时间: 2024-10-07 12:56:01

bzoj4457: 游戏任务--双层01背包的相关文章

hdu 1561The more, The Better(树形dp&amp;01背包)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4949    Accepted Submission(s): 2918 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝

WHYZOJ-#93. 暗黑破坏神(垃圾01背包)

[题目描述]: 无聊中的小x玩起了Diablo I... 游戏的主人公有n个魔法,每个魔法分为若干个等级,第i个魔法有p[i]个等级(不包括0).每个魔法的每个等级都有一个效果值,一个j级的i种魔法的效果值为w[i][j].魔法升一级需要一本相应的魔法书.购买魔法书需要金币,第i个魔法的魔法书价格为c[i]. 而小x只有m个金币(好孩子不用修改器) 你的任务就是帮助小x决定如何购买魔法书才能使所有魔法的效果值之和最大.开始时所有魔法为0级,效果值为0. [输入描述]: 第一行,用空格隔开的两个整

nyoj 203 三国志(最短路加01背包)

三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占的空城,但是这些空城中有很多不同数量的同种财宝.我们的小白同学虎视眈眈的看着这些城池中的财宝. 按照游戏的规则,他只要指派一名武将攻占这座城池,里面的财宝就归他所有了.不过一量攻占这座城池,我们的武将就要留守,不能撤回.因为我们的小白手下有无数的武将,

hdu 4044 GeoDefense (树形dp+01背包)

GeoDefense Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 663    Accepted Submission(s): 267 Problem Description Tower defense is a kind of real-time strategy computer games. The goal of towe

【算法学习笔记】30.动态规划 01背包和完全背包的关系

首先先说明一下01背包和完全背包问题的区别 01背包:有 N 件物品和一个容量为 V 的背包.放入第 i 件物品耗费的费用是 Ci,得到的价值是 Wi.求解将哪些物品装入背包可使价值总和最大.(可以不装满) 完全背包:有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用.放入第 i 种物品 的费用是 Ci,价值是 Wi.求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大. 先说结论: 两个问题的最优解都要用DP来解决,实现的过程也非常像只是在内层循环中

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

17-又见01背包

/*                                        又见01背包时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述        有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W     的物品,求所有挑选方案中物品价值总和的最大值.    1 <= n <=100    1 <= wi <= 10^7    1 <= vi <= 100    1 <= W <= 10^

HDU - 2602 Bone Collector(01背包讲解)

题意:01背包:有N件物品和一个容量为V的背包.每种物品均只有一件.第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大. 分析: 1.构造二维数组:dp[i][j]---前i件物品放入一个容量为j的背包可以获得的最大价值. dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - volume[i]] + value[i]);---(a) (1)dp[i - 1][j]---不放第i件物品,因此前i件物品放入一个容量为

01背包

这里就只放自己刷的题目了,毕竟是弱弱哒 HDU2546:饭卡 1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n,m; 9 while (~scanf("%d", &n), n) 10 { 11 int f[2013] = {0}, menu[2013] = {0}; 12 for (int i = 1; i <