开心

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值