请教,有题目和代码,不过不长,一眼就行
假设有n道题,做出第i道题后,可以获得的快乐指数将增加gethappy[i],而消耗掉的精力将是losspow[i]。
假设初始的快乐指数为 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"
#include"string.h"
main()
{
int i, j;
int f[2001], n;
int get[50], loss[50];
scanf("%d", &n);
memset(f, 0, 2001*sizeof(int));
for(i=0; i<n; i++) scanf("%d", &get[i]);
for(i=0; i<n; i++) scanf("%d", &loss[i]);
for(i=0; i<n; i++)
for(j=2000; j>=loss[i]+1; j--)
f[ j-loss[i] ] + get[i] > f[j]?f[j]= f[ j-loss[i] ] + get[i]:1;
printf("%d\n", f[1999]+1 );
}
f[ j-loss[i] ] + get[i] > f[j]?f[j]= f[ j-loss[i] ] + get[i]:1;
代码不是我写的
这句是如何完成题目要求的
[解决办法]
f[ j-loss[i] ] + get[i] > f[j]?f[j]= f[ j-loss[i] ] + get[i]:1;
这句是为了给f[j]赋值,这个值是在当前符合条件的前提下最大的一个
[解决办法]
f[i]里存储的即当精力值为i时所能获得的最大happy值
f[ j-loss[i] ] + get[i] > f[j]?f[j]= f[ j-loss[i] ] + get[i]:1;
即
if (f[j - loss[i]] + get[i] > f[j])
f[j]= f[j - loss[i]] + get[i];
代表当精力值为j时,如果存在另一种组合j = i + loss[i],使f[j - loss[i]] + get[i] > f[j],即代表发现精力值为j时的更优组合,所以采用新值
[解决办法]
背包问题,你查吧
[解决办法]
对,要认真学习