http://www.51cpc.com/problem/4051html
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候,他就用这两种包装来组合。固然有些糖果数目是没法组合出来的,好比要买 10 颗糖。 你能够用计算机测试一下,在这种包装状况下,最大不能买到的数量是17。大于17的任何数字均可以用4和7组合出来。 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。ide
输入两个正整数函数
输出不能最大组合的数字测试
Sample inputui
4 7
Sample Outputspa
17
像要你求最大,最小之类的题目大多数都是有技巧而言的,例如咱们之后会碰到的贪心、动态规划、数论等思想。因此说咱们要用数学的思惟去找出最简单的方法。code
要是硬解的话网上也有一大堆题解和对于数论公式的证实,那我从新写一遍也没什么意义了。htm
我是初学者,数论什么什么的都不知道,我只是隐隐约约的感受到这个应该和什么公式有关。blog
而后我就用找规律的方法把它写出来了。get
首先,先暴力一小部分,输出全部结果,
固然,写的时候也不是那么顺利,由于存在无解的状况存在,因此陷入了无限循环,而后我将将那些确定不存在的状况排除了。
而后就出现了
咱们要寻找的是ans=f(n,m),这样的函数;
经过不断试验发现:ans= n * m - n - m;
那么咱们直接输出公式就行了。
#include <stdio.h> bool find(int m, int p, int q) { for(int i=0;i<1000;i++) for (int j = 0;j<1000;j++) if (p * i + j * q == m) return true; return false; } int main() { printf("n\tm\tans\n"); for (int i = 2;i <= 20;i++) for (int j = 2;j <= 20;j++) for (int k = 1000;k >= 0;k--) if (!find(k, i, j)) { if (k >= 999) break; //模拟的时候发现那些无解的数都符合这个条件,因此就用这个将其排除掉。 printf("%d\t%d\t%d\n", i, j, k); break; } return 0; }
#include <stdio.h> int main() { int n, m; scanf("%d %d", &n, &m); printf("%d\n", n * m - n - m); return 0; }
若是您以为不错就点个推荐或者收藏吧!
此题为分支,其根为:http://www.javashuo.com/article/p-maerkngw-ch.html