咕噜咕噜哈里  

刚开始写这道题的时候就想着应该能转换一下思路,题目中也明写了,但还不是很清楚,觉得类似于公倍数,看到一位博主写的一个公式。

解题思路:

只有两个数的情况:
不能组成的数=(两数之积-两数之和)

数较多时:

利用dp数组,从最小值到最大值遍历寻找,

看看dp[i - 最小值]或dp[i - 最大值]是否为true.

如果为真,则置true,反之则更新最大值。

题目描述:

1 买不到的数目 问题描述 小明开了一家糖果店。他别出心裁:把水果糖包成 4 颗一包和 7 颗一包的两种。糖果不能拆 包卖。 
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比 如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是 17。大于 17 的任何 数字都可以用 47 组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于 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;

 

posted on 2021-08-06 20:39  咕噜咕噜哈里  阅读(78)  评论(0编辑  收藏  举报