题目内容:
没有买到奥运会的门票让YF伤心不已,为了使自己开心起来,他去找周围的人聊天,每找一个人聊天,他就会耗费一定的体力,但他会得到一定量的快乐。YF试图使自己尽可能的高兴,但一旦体力耗尽了(为零或为负),他也就挂了,就一点快乐都没有了。现在Yk初始有100点体力,他最多可以获得多少快乐?
输入描述
数据分多组,对于每组数据:第一行为n,表示有YK的n(0<n<21)个朋友。第二行表示和每个人聊天耗费的体力,第三行表示每个人所能提供的快乐值。输入以一个0结束。
输出描述
对于每组输出,输出一个值,YK可以获得的最大的快乐值。
输入样例
3 1 21 79 20 30 25 4 100 100 100 100 1 2 3 4 0
输出样例
50 0
程序代码
/* 思路: 和背包问题相似,体力值从1开始增加到99 */ #include <iostream> using namespace std; #define max(a, b) a > b ? a : b int main(){ int n, i, j; int e[100], h[100]; int D[100][100]; cin >> n; while(n != 0){ for(i = 1; i <= n; i++){ cin >> e[i]; } for(i = 1; i <= n; i++){ cin >> h[i]; } for(i = 1; i <= n; i++){ for(j = 1; j < 100; j++){ if(j < e[i]){// D[i][j] = D[i - 1][j]; }else{ D[i][j] = max(D[i - 1][j], D[i - 1][j - e[i]] + h[i]); } } } cout << D[n][99] << endl; cin >> n; } }