首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问,有题目和代码,不过不长,一眼就行

2012-04-06 
请教,有题目和代码,不过不长,一眼就行假设有n道题,做出第i道题后,可以获得的快乐指数将增加gethappy[i],而

请教,有题目和代码,不过不长,一眼就行
假设有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时的更优组合,所以采用新值

[解决办法]
背包问题,你查吧
[解决办法]
对,要认真学习

热点排行