A:题目描述:
数字拆分:
一个数字有两种拆法,1 对所有数字减一 2 把所有数字都拆分成两个更小的数之和,问之多拆分n次,把N完全消去需要多少轮操作。
输入取值范围: 1<= N <=100, 0<=K<=100
样例: 输入 5 2 ,输出 4。 输入15 4,输出 6
定义dp[i][j]为将i之多拆分j次所有的轮数,dp[i][j] = min(dp[i-1][j-1], dp[(i+1)/2][j-1]) + 1 , dp[i-1][j] 代表这次不拆分,减去1, dp[(i+1)/2][j-1] 代表这次进行拆分,拆分成两个中位数,那么较大的数的所需操作肯定大于较小的中位数的所需的操作。
public class MaIn { public static void main(String[] args){ Scanner in = new Scanner(System.in); String[] input = in.nextLine().split(" "); int n, m; n = Integer.parseInt(input[0]); m = Integer.parseInt(input[1]); // dp[1][0~100]=1; if(m==0){ System.out.print(n); return; } int[][] dp = new int[105][105]; for(int i=0;i<=100;i++){ dp[i][0] = i; } for(int i=0;i<=100;i++){ dp[1][i] = 1; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ dp[i][j]=Math.min(dp[i-1][j],dp[(i+1)/2][j-1])+1; } } System.out.print(dp[n][m]); } }