蓝桥杯_买不到的数目

蓝桥杯_买不到的数目

问题描述

小明开了一家糖果店。他别出心裁:把水果糖包成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;
}
原文地址:https://www.cnblogs.com/sakurapiggy/p/13216412.html