藍橋杯java 算法提高 郵票面值設計
阿新 • • 發佈:2018-01-24
java ava tint mat con for 升序 brush scanner 問題描述
給定一個信封,最多只允許粘貼N張郵票,計算在給定K(N+K≤13)種郵票的情況下(假定所有的郵票數量都足夠),如何設計郵票的面值,能得到最大值MAX,使在1~MAX之間的每一個郵資值都能得到。
例如,N=3,K=2,如果面值分別為1分、4分,則在1分~6分之間的每一個郵資值都能得到(當然還有8分、9分和12分);如果面值分別為1分、3分,則在1分~7分之間的每一個郵資值都能得到。可以驗證當N=3,K=2時,7分就是可以得到的連續的郵資最大值,所以MAX=7,面值分別為1分、3分。 輸入格式 一行,兩個數N、K 輸出格式 兩行,第一行升序輸出設計的郵票面值,第二行輸出“MAX=xx”(不含引號),其中xx為所求的能得到的連續郵資最大值。 樣例輸入 3 2 樣例輸出 1 3
MAX=7
例如,N=3,K=2,如果面值分別為1分、4分,則在1分~6分之間的每一個郵資值都能得到(當然還有8分、9分和12分);如果面值分別為1分、3分,則在1分~7分之間的每一個郵資值都能得到。可以驗證當N=3,K=2時,7分就是可以得到的連續的郵資最大值,所以MAX=7,面值分別為1分、3分。 輸入格式 一行,兩個數N、K 輸出格式 兩行,第一行升序輸出設計的郵票面值,第二行輸出“MAX=xx”(不含引號),其中xx為所求的能得到的連續郵資最大值。 樣例輸入 3 2 樣例輸出 1 3
MAX=7
import java.util.Scanner; public class Main { static int N, K; static int count[] = new int[11]; static int sum[] = new int[11]; static int Value[] = new int[1000]; public static void main(String[] args) { Scanner in = new Scanner(System.in); N = in.nextInt(); K = in.nextInt(); in.close(); count[1] = 1; Dp(1); for (int i = 1; i <= K; i++) { System.out.print(sum[i] + " "); } System.out.println(); System.out.print("MAX=" + (sum[0] - 1)); } private static void Dp(int dp) { int x = getbig(dp); if (dp == K) { return; } for (int i = x; i > count[dp]; i--) { count[dp + 1] = i; Dp(dp + 1); } } private static int getbig(int dp) { for (int i = 1; i <= 1000; i++) { Value[i] = 1000; for (int j = 1; j <= dp; j++) if (i >= count[j]) { Value[i] = Math.min(Value[i], Value[i - count[j]] + 1); } if (Value[i] > N) { if (i > sum[0]) { sum[0] = i; for (int j = 1; j <= dp; ++j) sum[j] = count[j]; } return i; } } return 0; } }
藍橋杯java 算法提高 郵票面值設計