8615 快乐

 

 

8615 快乐

该题有题解

时间限制:500MS  内存限制:1000K
提交次数:312 通过次数:98

题型: 编程题   语言: G++;GCC

 

Description

Lian是一个喜欢看动画片的人,自从成为ACMer(ACM爱好者)之后,他又迷上了网上做题。做题让他快乐,不过这也是需要付出精力的!!
假设有n道题,Lian做出第i道题后,他可以获得的快乐指数将增加gethappy[i],而消耗掉的精力将是losspow[i]。
假设Lian初始的快乐指数为1,精力为2000。可以理解,如果他消耗完了所有的精力那他得到再多的快乐都没有用。你的任务就是帮他计算他所能得到的最多的快乐指数,且最后他依然有多余的精力(即至少为1)。



输入格式

第一行输入一个整数n,表示有n个人。(n<=50)
第二行输入n个整数,表示gethappy[1]到gethappy[n]
第三行输入n个整数,表示losspow[1]到losspow[n]。


输出格式

一个整数,表示Lian所能获得的最大快乐指数。


 

输入样例

3
15 23 61
350 1301 1513



 

输出样例

77




 

来源

 jiangju0 

          原本以为用贪心,debug了很久才瞄到标签是用dp。看了相关dp章节仍旧蒙岔岔,最后还是得看博文介绍(http://blog.csdn.net/mu399/article/details/7722810) (http://blog.csdn.net/dapengbusi/article/details/7463968)如果全局的最优解可以用分布的最优解求出来,就用贪心,
如果不是,就动态规划(0-1背包属于这类)。通过与算法书中对比可知如果描述物品为可分割时即可用贪心。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 const int pow=2000;
 4 void dp(int worth[][2005],int gethappy[],int losspow[],int n)
 5 {
 6     int i,j;
 7     for(i=0;i<pow;i++)
 8         if(i<losspow[n])
 9           worth[n][i]=1;
10         else
11           worth[n][i]=1+gethappy[n];
12     for(i=n-1;i>=1;i--)
13     {
14         for(j=0;j<pow;j++)
15         {
16             if(losspow[i]>j)
17                 worth[i][j]=worth[i+1][j];
18             else
19             {
20                 if(worth[i+1][j-losspow[i]]+gethappy[i]>worth[i+1][j])
21                     worth[i][j]=worth[i+1][j-losspow[i]]+gethappy[i];
22                 else
23                     worth[i][j]=worth[i+1][j];
24             }
25         }
26     }
27 
28 }
29 int main()
30 {
31 
32     int gethappy[55],losspow[55],worth[55][2005],n,i;
33     scanf("%d",&n);
34     for(i=1;i<=n;i++)
35     {
36         scanf("%d",&gethappy[i]);
37     }
38     for(i=1;i<=n;i++)
39     {
40         scanf("%d",&losspow[i]);
41     }
42     dp(worth,gethappy,losspow,n);
43     printf("%d",worth[1][1999]);
44     return 0;
45 
46 }
View Code

 

posted @ 2015-12-01 18:54  keven_susu  阅读(507)  评论(0)    收藏  举报