题目描述
没有买到奥运会的门票让YF伤心不已,为了使自己开心起来,他去找周围的人聊天,每找一个人聊天
,他就会耗费一定的体力,
但他会得到一定量的快乐。YF试图使自己尽可能的高兴,但一旦体力耗尽了(为零或为负),他也就挂
了,就一点快乐都没有了。
现在Yk初始有100点体力,他最多可以获得多少快乐?
输入描述
数据分多组,对于每组数据:第一行为n,表示有YK的n(0<n<21)个朋友。第二行表示和每个人聊天
要耗费的体力值,
第三行表示每个人所能提供的快乐值。输入以一个0结束。
输出描述
没有买到奥运会的门票让YF伤心不已,为了使自己开心起来,他去找周围的人聊天,每找一个人聊天
,他就会耗费一定的体力,
但他会得到一定量的快乐。YF试图使自己尽可能的高兴,但一旦体力耗尽了(为零或为负),他也就挂
了,就一点快乐都没有了。
现在Yk初始有100点体力,他最多可以获得多少快乐?
输入描述
数据分多组,对于每组数据:第一行为n,表示有YK的n(0<n<21)个朋友。第二行表示和每个人聊天
要耗费的体力值,
第三行表示每个人所能提供的快乐值。输入以一个0结束。
输出描述
对于每组输出,输出一个值,YK可以获得的最大的快乐值。
解题报告:
简单回溯。
import java.util.Scanner;
public class N11Happy {
int happy=0;
int current=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] a=new int[100][100];
int i=0;
while(true){
int n=sc.nextInt();
if(n==0){
break;
}else{
a[i][0]=n;
for(int j=1;j<=2*n;j++){
a[i][j]=sc.nextInt();
}
i++;
}
}
for(int k=0;k<i;k++){
N11Happy ha= new N11Happy();
ha.getHappy(a[k], a[k][0], 100, 1);
System.out.println(ha.happy);
}
}
private void getHappy(int[] a, int n, int power,int c) {
if(c>n){
if(current>happy){
happy=current;
return;
}
}else{
for(int i=c;i<=n;i++){
if(a[i]<power){
power-=a[i];
current+=a[i+n];
getHappy(a,n,power,i+1);
current-=a[i+n];
power+=a[i];
}
else{
getHappy(a,n,power,i+1);
}
}
}
}
}
1006

被折叠的 条评论
为什么被折叠?



