一、实验目
练习使用动态规划算法解决实际问题(使用Java语言实现)。
二、实验内容
【问题描述】
小明这学期有n门课程,他计划最多花m天学习。根据他在不同课程上花费的天数,他将获得不同的价值,求如何安排n门课程的m天可使价值最大化
【输入】
输入包含多个测试用例。每个测试用例的第1行都包含两个正整数n和m,分别表示课程数和天数。接下来是矩阵a[i][j],1<=i<=n<=100,1<=j<=n<=100,a[i][j]表示在第i门课程上花费j天将获得的价值。在n=0,m=0时结束输入。
【输出】
对每个测试用例,都单行输出获得的最大价值。
【示例】
输入样例:
一、实验目的
练习使用动态规划算法解决实际问题(使用Java语言实现)。
二、实验内容
【问题描述】
小明这学期有n门课程,他计划最多花m天学习。根据他在不同课程上花费的天数,他将获得不同的价值,求如何安排n门课程的m天可使价值最大化
【输入】
输入包含多个测试用例。每个测试用例的第1行都包含两个正整数n和m,分别表示课程数和天数。接下来是矩阵a[i][j],1<=i<=n<=100,1<=j<=n<=100,a[i][j]表示在第i门课程上花费j天将获得的价值。在n=0,m=0时结束输入。
【输出】
对每个测试用例,都单行输出获得的最大价值。
【示例】
输入样例:
2 2 1 2 1 3 2 2 2 1 2 1 2 3 3 2 1 3 2 1 0 0
输出样例:
3 4 6
三、 程序代码
ACboy.java
package ACboys;
import java.util.Scanner;
public class ACboy {
private int n;//n表示课程数
private int m;//m表示可用天数
private int[][] matrix;//二维数组存放学习课程对应天数可获得的价值
private int[] dp;
Scanner sc =new Scanner(System.in);
public void total_function(){
input1();
while (n!=0&&m!=0){
intputMatrix(n,m);
solve();
output();
input1();
}
return;
}
private void input1(){//输入天数和课程数函数
n=sc.nextInt();
m=sc.nextInt();
}
private void intputMatrix(int courses,int days){//输入二维数组函数
dp=new int[105];//重置dp数组
matrix=new int[courses+1][days+1];//根据课程数和天数大小创建二维数组
for(int i=1;i<=courses;i++){
for(int j=1;j<=days;j++){
matrix[i][j]=sc.nextInt();
}
}
}
private void solve(){
for(int k=1;k<=n;k++){//遍历k门课程
for(int i=m;i>=0;i--){//遍历使用的天数,因为是一维写,并且每门课程只能选择一种天数,所以要倒着遍历
for(int j=1;j<=m;j++){//第k组门课程里的m种天数里面选择一个,
if(i>=j)
dp[i]=max(dp[i],dp[i-j]+matrix[k][j]);
}
}
}
}
private int max(int a,int b){
return a>b?a:b;
}
private void output(){
System.out.println(dp[m]);
}
}
test.java
package ACboys;
public class test {
public static void main(String[] args) {
ACboy aCboy=new ACboy();
aCboy.total_function();
}
}
四、 实验结果(含程序运行截图)



