题目链接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代码如下:

 # include<stdio.h>
# include<memory.h>
# define MAXN
int dp[MAXN][MAXN],dp2[MAXN][MAXN];
int car[][]; //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=,x,y;
int curr_a,curr_b; //分别表示所有车全部装头盔、全部装盔甲 的最大数量
while(scanf("%d",&n)== && 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=;i<n;i++) scanf("%d%d",&car[][i],&car[][i]);
for(i=; i<MAXN; i++)
for(j=; j<MAXN; j++)
dp[i][j] = dp2[i][j] = -;
curr_a = curr_b = ;
dp2[][] = ;
k = ;
while(k < n){
for(i=; i<= curr_a; i++)
for(j=; j<=curr_b; j++){
dp[i][j] = dp2[i][j];
dp2[i][j] = -;
}
int r_a =min(car[][k] / w1, car[][k] / s1); //该车能够装头盔数量的最大值
for(i=; i<=r_a; i++)
{
int r_aw = car[][k] - i * w1; //装了头盔后剩下的总重量
int r_as = car[][k] - i * s1; //装了头盔后剩下的总体积
int r_b = min(r_aw / w2, r_as / s2); //该车剩下部分能够装盔甲数量的最大值
for(j=; 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=; x<=curr_a; x++)
for(y=; y<=curr_b; y++)
if(dp[x][y] >= && dp[x][y] + r_c >dp2[x+i][y+j])
dp2[x+i][y+j] = dp[x][y] +r_c;
}
}
curr_a += min(car[][k] / w1, car[][k] / s1);
curr_b += min(car[][k] / w2, car[][k] / s2);
k++;
}
int ans =;
for(i=; i<=curr_a; i++)
for(j=; j<=curr_b; j++)
if(dp2[i][j] != -){
int temp = compute(i,j,dp2[i][j]);
if(temp > ans) ans = temp;
}
if(cas>) puts("");
printf("Case %d: %d\n", ++cas, ans);
}
return ;
}

ZOJ 1013 Great Equipment(DP)的更多相关文章

  1. ZOJ 4027 Sequence Swapping(DP)题解

    题意:一串括号,每个括号代表一个值,当有相邻括号组成()时,可以交换他们两个并得到他们值的乘积,问你最大能得到多少 思路:DP题,注定想得掉头发. 显然一个左括号( 的最远交换距离由他右边的左括号的最 ...

  2. ZOJ 2625 Rearrange Them(DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1625 题目大意:将n个数重新排列,使得每个数的前一个数都不能和之前的 ...

  3. ZOJ 2745 01-K Code(DP)(转)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1745 题目大意:一个串由N个字符组成,每个字符是‘0’或者是‘1’, ...

  4. ZOJ 3211 Dream City(DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3374 题目大意:JAVAMAN 到梦幻城市旅游见到了黄金树,黄金树上 ...

  5. ZOJ 2702 Unrhymable Rhymes(DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1702 题目大意:给定有很多数字组成的诗,譬如 “AABB”, “AB ...

  6. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  7. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  8. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  9. ZOJ 2477 Magic Cube(魔方)

    ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds      Memory Limit: 65536 KB This is a very popular gam ...

随机推荐

  1. 使用Windows Azure创建Linux系统虚拟机-上

    创建虚拟机来运行Linux 当您在Azure管理门户中使用映像图库时,创建运行Linux的虚拟机很容易.本指南告诉您如何做到这一点,假设你没有使用过Azure. 注意: 即使你不需要使用过Azure虚 ...

  2. office文件密码破解方法及软件

    今天会用到3个软件 1.Office Password Remover 说明:这个软件可以很快破解.doc   .xls的密码 使用方法:参考百度经验里面的文章http://jingyan.baidu ...

  3. HW3.6

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  4. Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1

    One of the added bonuses of Dynamics CRM is its ability go where you go! With the Spring ’14 Wave Up ...

  5. Win7 64位 安装E10后 打不开的解决方案 -摘自网络

    但是后来发现点击IE图标没有任何反应,因此从网络上寻求帮助!将经验分享大家!进入注册表(运行regedit),找到 HKEY_CURRENT_USER\Software\Microsoft\Inter ...

  6. UVALive 5111 Soccer Teams (动态规划)

    题意:给指定数量的数字“1”,“2”,“3”……,“9”.用所有这些数字加上任意个0组成一个数,要求数能被11整除,且数的位数尽量小. 能被11整除的数有一个特点,奇数位数字之和与偶数位之和的差为11 ...

  7. __attribute__ ((__section__ (".init.text")))

    在kernel中有很多__init,这个东东到底是何方神圣捏?且听小生我一一道来.下面是其定义:file:/include/linux/init.h 43 #define __init      __ ...

  8. Robotium学习笔记二

    一. 控制测试用例的执行顺序 采用TestSuit方式来控制每条Case的运行顺序 Demo如下 public static Test suite() { TestSuite suite = new ...

  9. Spring源码入门——AnnotationBeanNameGenerator解析

    ---恢复内容开始--- 接上篇,上篇解析了DefaultBeanGenerator生成bean name的过程(http://www.cnblogs.com/jason0529/p/5272265. ...

  10. 解决Debian-7.1下Chrome浏览器字体难看的问题

    首先在 Advance Setting 的 font 标签页下做如下配置: 然后在用户目录下创建 .fonts.conf 文件,内容如下: <?xml version='1.0'?> &l ...