买不到的数目
题目
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
这个是用殴几里得的思想,但是不是java语言,我看的不是很懂
https://blog.csdn.net/u010579068/article/details/44873361?ops_request_misc=%7B%22request%5Fid%22%3A%22158353795419725219900422%22%2C%22scm%22%3A%2220140713.130056874…%22%7D&request_id=158353795419725219900422&biz_id=0&utm_source=distribute.pc_search_result.none-task
这个是用背包思想,但是语言是c++,我看不懂,但讲的还蛮好的
https://blog.csdn.net/qq_43271202/article/details/102919843?ops_request_misc=%7B%22request%5Fid%22%3A%22158353795419725219900422%22%2C%22scm%22%3A%2220140713.130056874…%22%7D&request_id=158353795419725219900422&biz_id=0&utm_source=distribute.pc_search_result.none-task
用数学方法得出
证明的方法:
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();
System.out.println(a*b-a-b);
}
}
代码
import java.util.Scanner;
public class 买不到的数目 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
//动态规划法,他是每一层慢慢叠加,制作一个二维数组,之后一个个来看能不能实现
boolean[] p=new boolean[a*a+b*b+1];//但是怎么建立的一维数组,
//一维数组,长度为a*a+b*b+1
//还有一个问题,为什么非要b再试a呢?我一转换就不对了
//因为a*b就是最小公倍数
for(int i=0;i<=b;i++){
for(int j=0;j<=a;j++)
p[i*a+b*j]=true;//p可以买到的数量,即i从0开始,到i=a
}
for(int i=p.length-1;i>=0;i--){//因为要求最大,所以从最后面开始遍历,如果出现false,就为所求值
if(p[i]==false&&i<=a*b){//其实我就是不懂为什么要是a*b,这是最小公倍数(应该是,在一般情况下?
//为什么要小于等于最小公倍数?如果等于最小公倍数,则说明,我的两个袋糖果都可以直接等于这个数值,而不能等于的要比他小
//这也有点不能说出理由,因为你怎么知道我能不能往上面写呢?
System.out.println(i);
return;
}
}
}
}