题目描述:
有许多程序员都热爱玩游戏游戏,而小J自称为游戏王,曾玩过几百种游戏,几乎所有能玩到的游戏大作都玩遍了。随着时间的推移,他发觉已经没有游戏可以让他玩了!于是他想改玩一些古老的游戏,以成为真正的“游戏王”。他希望在接下来的一段时间内将过去出的游戏全部玩一遍,但是毕竟时间有限,因此他感到很苦恼。于是他给每个游戏标上一个成就值,同时估算了完成这些游戏所需要的时间。
现在他只有X天时间。而每个游戏一旦开始玩,至少需要玩一天才能够停下来。那么,他所玩完的游戏的成就值之和最大能达到多少呢?(每个游戏必须玩完才能取得成就值。)
输入:
第一行输入case数T(0<T<20)。对于每个case,第一行输入游戏的数目N(0<N<11),总时间X(0<X<1000)用空格分隔。从第二行到第N+1行每行输入游戏的成就值Ai(0<Ai<10000),所需要花费时间Bi(0<Bi<10000)。
输出:
对每个case输出一行,成就值之和的最大值。
样例输入:
2
2 2
10 1
20 2
3 4
10 2
18 3
10 2
样例输出:
20
20
程序如下:
package test;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//Case数目
String t = sc.nextLine();
int T = Integer.parseInt(t);
int N = 0;
int X = 0;
int[] A = null;
int[] B = null;
int[] result = new int[T];
for(int k=0;k<T;k++) {
String str1 = sc.nextLine();
String[] s1 = str1.split(" ");
//游戏数目
N = Integer.parseInt(s1[0]);
//总时间
X = Integer.parseInt(s1[1]);
//游戏成就值
A = new int[N];
//所需花费的时间
B = new int[N];
for(int j=0;j<N;j++) {
String str2 = sc.nextLine();
String[] s2 = str2.split(" ");
//游戏成就值
A[j] = Integer.parseInt(s2[0]);
//所需花费的时间
B[j] = Integer.parseInt(s2[1]);
}
//处理函数-0/1背包问题
int[] count = new int[X+1];
for(int i=1;i<=N;i++) {
for(int j=X;j>=B[i-1];j--) {
count[j] = Math.max(count[j-B[i-1]]+A[i-1], count[j]);
}
}
//将结果存入数组中
result[k] = count[X];
}
//一起输出结果
for(int res : result) {
System.out.println(res);
}
sc.close();
}
}
本文介绍了一个关于游戏选择的0/1背包问题,小J作为游戏王,面临在有限时间内选择游戏以最大化成就值的问题。文章通过一个具体的案例,详细解释了如何使用动态规划解决此问题,并提供了完整的Java代码实现。
595

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



