title: 每日一题–01背包
date: 2019-12-05 12:51:35
tags:
- 每日一题
- 算法
61.快乐 (5分)
Java时间限制:3 毫秒 | Java内存限制:1000 Kb
题目内容:
没有买到奥运会的门票让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
public class Main {
static int n;
static int cost[] = new int[100], get[] = new int [100];
static int pak[][] = new int[101][101];
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
n = scanner.nextInt();
while(n != 0) {
for (int i = 1; i <= n; i++) {
cost[i] = scanner.nextInt();
}
for (int i = 1; i <= n; i++) {
get[i] = scanner.nextInt();
}
fun01();
System.out.println(pak[n][99]);
n = scanner.nextInt();
}
}
public static void fun01() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 99; j++) {
if(j < cost[i]) {
pak[i][j] = pak[i - 1][j];
}else {
int value1 = pak[i - 1][j];
int value2 = pak[i - 1][j - cost[i]] + get[i];
if(value1 > value2) {
pak[i][j] = value1;
}else {
pak[i][j] = value2;
}
}
}
}
}
}
许久没有更新,再次更新已经到了今日。期间一直在准备英语六级,基本一有时间都泡在图书馆,我努力在复习,只希望能有一个较好的结果,不像上次那样,还差最后两分就过了。
然后便就是犹豫蓝桥杯的事情,觉得还是尝试一下吧,哪怕最终的结果不是那样的令人满意。纠结了一上午的语言选择问题,这也便是我这题选择用java实现的原因。没啥好纠结的了,报!报c语言!
然后我们回到这题,01背包问题,思路理清,正如这个算法一样,一步一步逼近答案。这里是选择了填二维表的形式,应该还有更好的办法,那就待我们自己去一步一步探索吧!