钢条切割-递归,记忆性递归,dp
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了钢条切割-递归,记忆性递归,dp相关的知识,希望对你有一定的参考价值。
钢条切割
方法1:递归
import java.util.Scanner;
public class Cutting {
public static int n = 10 ;
public static int [] p = {1,5,8,16,10,17,17,20,24,30} ;
public static int cut(int x){
int res = 0 ;
if(x == 0){
return 0 ;
}
for(int i=1; i<=x; i++){
int temp = p[i-1] + cut(x-i) ; //每一段的价格+剩余的最佳方案的价格
res = Math.max(temp, res) ; //找出所有temp的最大值,即是切割后的最大价值
}
return res ;
}
public static void main(String[] args){
Scanner input = new Scanner(System.in) ;
int x = input.nextInt() ;
System.out.println(cut(x)) ;
}
}
方法2:记忆性递归–提高效率
import java.util.Arrays;
import java.util.Scanner;
public class Cutting {
public static int n = 10 ;
public static int [] p = {1,5,8,16,10,17,17,20,24,30} ;
static int [] remember = new int [n] ;
public static int cut(int x){
int res = 0 ;
if(x == 0){
return 0 ;
}
for(int i=1; i<=x; i++){
if(remember[x-i] == -1){
remember[x-i] = cut(x-i) ; //提前找到,存储,不用每次都寻找
}
int temp = p[i-1] + remember[x-i] ; //每一段的价格+剩余的最佳方案的价格
res = Math.max(temp, res) ; //找出所有temp的最大值,即是切割后的最大价值
}
return res ;
}
public static void main(String[] args){
Scanner input = new Scanner(System.in) ;
Arrays.fill(remember,-1) ;
int x = input.nextInt() ;
System.out.println(cut(x)) ;
}
}
方法3:动态规划
import java.util.Arrays;
import java.util.Scanner;
public class Cutting {
public static int n = 10 ;
public static int [] p = {1,5,8,16,10,17,17,20,24,30} ;
static int [] vs = new int [n+1] ;
public static int dp(int x){
for(int i=1; i<=x; i++){ //拥有钢条的长度
for(int j=1; j<=i; j++){ //所有可能组合成i的数字范围为1~i
int temp = vs[i-j] + p[j-1] ; //p[j-1]为长度为j的价值,vs[i-j]为其余长度的最大价值
vs[i] = Math.max(vs[i], temp) ; //长度为i的钢条如果出现更大价值,就更新
}
}
return vs[x];
}
public static void main(String[] args){
Scanner input = new Scanner(System.in) ;
Arrays.fill(vs, 0) ;
int x = input.nextInt() ;
System.out.println(dp(x)) ;
}
}
以上是关于钢条切割-递归,记忆性递归,dp的主要内容,如果未能解决你的问题,请参考以下文章