刚开始写这道题的时候就想着应该能转换一下思路,题目中也明写了,但还不是很清楚,觉得类似于公倍数,看到一位博主写的一个公式。
解题思路:
只有两个数的情况:
不能组成的数=(两数之积-两数之和)
数较多时:
利用dp数组,从最小值到最大值遍历寻找,
看看dp[i - 最小值]或dp[i - 最大值]是否为true.
如果为真,则置true,反之则更新最大值。
题目描述:
1 买不到的数目 问题描述 小明开了一家糖果店。他别出心裁:把水果糖包成 4 颗一包和 7 颗一包的两种。糖果不能拆 包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比 如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是 17。大于 17 的任何 数字都可以用 4 和 7 组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于 1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入 1
4 7 样例输出 1
17
样例输入 2
3 5
样例输出 2
7
C++:
只有两个的情况:
1 #include<iostream> 2 using namespace std; 3 4 int main(){ 5 int a; 6 int b; 7 int c; 8 cin>>a>>b; 9 10 c=(a*b)-(a+b); 11 cout<<c; 12 }
dp数组:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 int n; 6 int m; 7 long int minn,maxx,buy; 8 bool dp[1000000]; 9 //这堆东西要被放出来,不能放在 int main()里 10 11 int main(){ 12 13 cin>>n>>m; 14 dp[0]=true; 15 minn=min(n,m); //为啥min=minn(n,m)不可以?? 16 maxx=max(n,m); 17 for(int i= minn;i < n * m;i++){ 18 if(dp[i-minn]){ 19 dp[i] = true; //看看dp[i - n]或者dp[i - m]是否为true 20 } 21 else if(i >= maxx && dp[i-maxx]){ //相当于从minn开始,不断往前走,每走到一个数 22 dp[i] = true; 23 } 24 else{ 25 buy = i; 26 } 27 } 28 cout<< buy; 29 return 0;