开心

题目内容:
没有买到奥运会的门票让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;
	}
	
	
} 


猜你喜欢

转载自blog.csdn.net/ctgu361663454/article/details/78110806