8615 快乐
8615 快乐该题有题解 时间限制:500MS 内存限制:1000K 题型: 编程题 语言: G++;GCC
DescriptionLian是一个喜欢看动画片的人,自从成为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 }

浙公网安备 33010602011771号