【題目描述】:
小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。
小朋友來買糖的時候,他就用這兩種封裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。
你可以用電腦測試一下,在這種封裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。
本題的要求就是在已知兩個封裝的數量時,求最大不能組合出的數字。 輸入格式
兩個正整數,表示每種封裝中糖的顆數(都不多於1000) 輸出格式
一個正整數,表示最大不能買到的糖數 範例輸入1 4 7
範例輸出1 17 範例輸入2 3 5
範例輸出2 7
【解法1】:
定義一個大數組,數組最先初始化為0,即不能買的數為0,再後面將能買的數設為1,最後從後向前遍曆,輸出數組中第一個為0的數,即為不能買到的最大數量 【代碼】:
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt();int b = sc.nextInt();int s[] = new int[1000000];for (int i = 0; i < a * b; i++) {for (int j = 0; j < a * b; j++) {if (a * i + b * j >= 1000000)//超過數組範圍時退出break;s[a * i + b * j]++;}}int k = 0;for (int i = a * b - 1; i >= 0; i--)if (s[i] == 0) {k = i;break;}System.out.println(k);}}
【解法2】:完全背包
【代碼】:
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a[]=new int[2]; a[0] = sc.nextInt(); a[1] = sc.nextInt();int s[] = new int[1000000]; s[a[0]]=s[a[1]]=1;int m=a[0]*a[1];int k = 0;for(int i=1;i<m;i++){for(int j=0;j<=1;j++)if(a[j]<i)s[i]+=s[i-a[j]];if(s[i]==0)k=i;}System.out.println(k);}}