標籤:如何 for 描述 一個 粘貼 tin 提高 mat str
問題描述 給定一個信封,最多隻允許粘貼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
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 演算法提高 郵票面值設計