蓝桥杯_买不到的数目
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
思路
这道题拿到有点懵,完全不知道该怎么用动态规划,于是秉持着遇事不决,暴力解决的思想,直接暴力;
这道题是求最大值,那么暴力也要有边界呀,我设置暴力的边界为两个整数的乘积;
但是为什么设置乘积为上限呢,emmm我猜的,我尝试手写了几个,发现大于乘积的数都可以被表示,于是就这样设置了;
然后设置两个系数,我设置每个数字乘以0-100再相加,把得到的结果的位置设置为1,这样再从大往小搜索到第一个数字作为结果;这样对于值小的数字应该可以覆盖了,比如4和7;
这样做有66%的正确率,也就是3个例子能对2个,另外一个应该是范围没有覆盖到,代码如下:
#include <bits/stdc++.h>
using namespace std;
using namespace std;
class Solution {
public:
int solve();
};
int Solution::solve() {
int m, n;
cin>>m>>n;
int *res = NULL;
res = new int[100*(m+n)];
memset(res, 0, 100*(m+n)*sizeof(int));
for (int i=0; i<100; i++) {
for (int j=0; j<100; j++) {
res[m*i+n*j] = true;
}
}
for (int i=m*n; i>0; i--) {
if (!res[i]){
return i;
}
}
return -1;
}
int main(void) {
Solution su;
cout<<su.solve()<<endl;
}
然后去网上找一找正确答案,发现这是一个数论问题的结论,有一个什么裴蜀定理的,经过证明可知: 对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式): !@#¥%……&*
翻译过来就是说答案是m*n-m-n:
事实证明程序员还是应该研究数学,有了数学结果这个问题很容易就解决了,而且是100%,呜呜呜呜:
#include <bits/stdc++.h>
using namespace std;
int main(void) {
int m, n;
cin>>m>>n;
cout<<m*n-m-n<<endl;
return 0;
}