ZOJ 1013 Great Equipment(DP)
2013-07-30 02:03
453 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=13
题目大意:说的是有三种不同的装备,分别是头盔,盔甲,战靴需要运输,每种装备拥有不同的重量,体积,以及防御能力.当三种装备按照一定的数量规定组合成套装时,套装可以发挥处更强的攻击能力.然后有n个运输车,每个车能够运送的重量和体积有限制,现在问如何给这个n个运输车分配运送任务(即每个运输队运多少头盔,多少盔甲,多少战靴) 可以获得总的防御值最大。
输入描述:第一行是运输车的数量n。接下来是第1行是每个头盔的重量w1、体积s1、防御能力d1;第2行是每个盔甲的重量w2、体积s2、防御能力d2;第3行是每个战靴的重量w3、体积s3、防御能力d3;第4行是每个c1头盔,c2个盔甲,c3个战靴组成的套装的防御能力d4。接下来的n行每行2个整数,分别表示每个运输车能承受的最大重量和体积。
Sample Input
3
1 1 3
5 6 10
2 1 2
1 1 1 50
1 1
5 6
2 1
0
Output for the Sample Input
Case 1: 50
分析:能把复杂度降下来的就可以称为DP。
法1:由于套装威力强,我们应该凑出尽量多的套装然后再单算剩余装备的防御力.因此在运输的头盔数,盔甲数一定时要使运输的战靴数尽可能地多。
1、G++下,至少在dp型数组中,用memset、和memcpy函数的效率不如用循环初始化、复制快
2、此题以dp[i][j]存储拿了 i 件头盔(a武器),j 件盔甲(b武器)时能拿的最大的战靴(c武器)的数量
3、最后一个状态(最后一个车到达)后,用compute函数计算分别拿了各种数
量的三种武器后,能达到的防御力,从中挑选最大的
法2:网上很多人的思路都是设f[i][n1][n2]表示用前i量车子在运 n1件1武器和n2件2武器的条件下能运的第3种武器的最大数量。
那么f[0][0][0]=0设函数num(i,j,k)表示第i量车子在运j个1武器和k个2武器后最多再能运k个3武器,则f[i][n1][n2]=f[i-1][n3][n4]+num(i,n1-n3,n2-n4)
f[i]的值只于f[i-1]有关,那么可以用滚动数组来节省空间
本以为是背包,牛们居然用枚举做出来了
法1代码如下:
题目大意:说的是有三种不同的装备,分别是头盔,盔甲,战靴需要运输,每种装备拥有不同的重量,体积,以及防御能力.当三种装备按照一定的数量规定组合成套装时,套装可以发挥处更强的攻击能力.然后有n个运输车,每个车能够运送的重量和体积有限制,现在问如何给这个n个运输车分配运送任务(即每个运输队运多少头盔,多少盔甲,多少战靴) 可以获得总的防御值最大。
输入描述:第一行是运输车的数量n。接下来是第1行是每个头盔的重量w1、体积s1、防御能力d1;第2行是每个盔甲的重量w2、体积s2、防御能力d2;第3行是每个战靴的重量w3、体积s3、防御能力d3;第4行是每个c1头盔,c2个盔甲,c3个战靴组成的套装的防御能力d4。接下来的n行每行2个整数,分别表示每个运输车能承受的最大重量和体积。
Sample Input
3
1 1 3
5 6 10
2 1 2
1 1 1 50
1 1
5 6
2 1
0
Output for the Sample Input
Case 1: 50
分析:能把复杂度降下来的就可以称为DP。
法1:由于套装威力强,我们应该凑出尽量多的套装然后再单算剩余装备的防御力.因此在运输的头盔数,盔甲数一定时要使运输的战靴数尽可能地多。
1、G++下,至少在dp型数组中,用memset、和memcpy函数的效率不如用循环初始化、复制快
2、此题以dp[i][j]存储拿了 i 件头盔(a武器),j 件盔甲(b武器)时能拿的最大的战靴(c武器)的数量
3、最后一个状态(最后一个车到达)后,用compute函数计算分别拿了各种数
量的三种武器后,能达到的防御力,从中挑选最大的
法2:网上很多人的思路都是设f[i][n1][n2]表示用前i量车子在运 n1件1武器和n2件2武器的条件下能运的第3种武器的最大数量。
那么f[0][0][0]=0设函数num(i,j,k)表示第i量车子在运j个1武器和k个2武器后最多再能运k个3武器,则f[i][n1][n2]=f[i-1][n3][n4]+num(i,n1-n3,n2-n4)
f[i]的值只于f[i-1]有关,那么可以用滚动数组来节省空间
本以为是背包,牛们居然用枚举做出来了
法1代码如下:
# include<stdio.h> # include<memory.h> # define MAXN 501 int dp[MAXN][MAXN],dp2[MAXN][MAXN]; int car[2][100]; //car[0][i]、car[1][i] 分别表示第i辆车的能承受的重量、体积 int n; //车的数量 int w1,w2,w3,s1,s2,s3,c1,c2,c3,d1,d2,d3,d4; int min(int a,int b){ return a<b ? a :b; } int compute(int a,int b,int c){ //计算防御能力 int minnum; minnum = min(min(a/c1,b/c2),c/c3); return (minnum * d4 + (a- minnum*c1)*d1 + (b- minnum*c2)*d2 + (c- minnum*c3)*d3); } int main(){ int i,j,k,cas=0,x,y; int curr_a,curr_b; //分别表示所有车全部装头盔、全部装盔甲 的最大数量 while(scanf("%d",&n)==1 && n){ scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d", &w1, &s1, &d1, &w2, &s2 ,&d2, &w3, &s3, &d3, &c1, &c2, &c3, &d4); for(i=0;i<n;i++) scanf("%d%d",&car[0][i],&car[1][i]); for(i=0; i<MAXN; i++) for(j=0; j<MAXN; j++) dp[i][j] = dp2[i][j] = -1; curr_a = curr_b = 0; dp2[0][0] = 0; k = 0; while(k < n){ for(i=0; i<= curr_a; i++) for(j=0; j<=curr_b; j++){ dp[i][j] = dp2[i][j]; dp2[i][j] = -1; } int r_a =min(car[0][k] / w1, car[1][k] / s1); //该车能够装头盔数量的最大值 for(i=0; i<=r_a; i++) { int r_aw = car[0][k] - i * w1; //装了头盔后剩下的总重量 int r_as = car[1][k] - i * s1; //装了头盔后剩下的总体积 int r_b = min(r_aw / w2, r_as / s2); //该车剩下部分能够装盔甲数量的最大值 for(j=0; j<=r_b; j++) { int r_bw = r_aw - j * w2; //再装盔甲后剩下的总重量 int r_bs = r_as - j * s2; //再装盔甲后剩下的总体积 int r_c = min(r_bw / w3,r_bs/s3); //该车剩余部分最多能装战靴的数量 for(x=0; x<=curr_a; x++) for(y=0; y<=curr_b; y++) if(dp[x][y] >=0 && dp[x][y] + r_c >dp2[x+i][y+j]) dp2[x+i][y+j] = dp[x][y] +r_c; } } curr_a += min(car[0][k] / w1, car[1][k] / s1); curr_b += min(car[0][k] / w2, car[1][k] / s2); k++; } int ans =0; for(i=0; i<=curr_a; i++) for(j=0; j<=curr_b; j++) if(dp2[i][j] != -1){ int temp = compute(i,j,dp2[i][j]); if(temp > ans) ans = temp; } if(cas>0) puts(""); printf("Case %d: %d\n", ++cas, ans); } return 0; }
相关文章推荐
- ZOJ 1013 Great Equipment(DP)
- ZOJ 1013 Great Equipment ---- DP
- ZOJ 1013 Great Equipment (DP)
- Great Equipment - ZOJ 1013 dp
- zoj 1013 Great Equipment
- zoj 1013 Great Equipment
- ZOJ 1013 Great Equipment
- poj 1013 great equipment(背包,dp)
- ZOJ 1013 Great Equipment
- zoj 1013 Great Equipment DP
- ZOJ 1013 Great Equipment
- zju 1013 Great Equipment(DP)
- [DP] ZOJ1013、1027、1074
- ZOJ 3689 Digging(贪心+dp)
- LightOJ1013-Love Calculator-dp
- ZOJ 3256 Tour in the Castle (插头DP求回路个数+矩阵乘法)
- ZOJ 3644 Kitty's Game(DP)
- ZOJ 3777 Problem Arrangement(壮压dp)
- zoj 3494(ac自动机+数位dp)
- 简单dp之递推(2)--ZOJ 3747