8615 快乐
时间限制:500MS 内存限制:1000K
提交次数:312 通过次数:98
题型: 编程题 语言: C++;C
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
#include<stdio.h> int max(int a, int b) { if (a > b) return a; else return b; } int n; int happymax[10000][100]; int gethappy[100]; int losspow[100]; int getmax(int pow, int n) { int retmax; if (happymax[pow][n] != -1) retmax = happymax[pow][n]; else if (n == 0) { if (pow > losspow[n]) retmax = gethappy[n]; else retmax = 0; } else if (pow >= losspow[n]) retmax = max(getmax(pow - losspow[n], n - 1) + gethappy[n], getmax(pow, n - 1)); else retmax = getmax(pow, n - 1); happymax[pow][n] = retmax; return retmax; } int main() { int i, j; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &gethappy[i]); for (i = 0; i < n; i++) scanf("%d", &losspow[i]); for (i = 0; i <= 2000; i++) for (j = 0; j < n; j++) happymax[i][j] = -1; printf("%d", getmax(2000, n - 1) + 1); return 0; } /*对于这n道题,lian要么就做出来,要么就没有做出来(对一道题重复做没什么意义), 我们假设lian是从第1题开始做,直到去做第n道题,对这n道题编号如下 1 2 3 4 5 6 7 。。。(n-1) 定义数组losspow[55]表示做出第i道题需要消耗的pow值 定义数组gethappy[55]表示做出第i道题获得的happy值 定义二维数组maxhappy[2020][55]作为状态,表示前i道题获得的最大快乐值(注意这里的前i道题是从0开始数) 我们对问题的最后一个步骤进行思考*/