首页 > 其他 > 详细

暴力枚举与总结规律——买不到的数目

时间:2021-02-07 23:05:16      阅读:27      评论:0      收藏:0      [点我收藏+]

买不到的数目

问题描述:
小明开了一家糖果店。

他别出心裁:把水果糖包成4颗一包和7颗一包的两种。

糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。

当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。

大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入格式
两个正整数 n,m,表示每种包装中糖的颗数。

输出格式
一个正整数,表示最大不能买到的糖数。

数据范围
2≤n,m≤1000,
保证数据一定有解。

输入样例:
4 7

输出样例:
17

分析:
先分析样例
样例 4 7 能组成的数k=an+bm:
0 (0个4,0个7)
4 (1,0)
7 (0,1)
8 (2,0)
11(1,1)
12(3,0)
14(0,2)
15(2,1)
16(4,0)
18(1,2)
19(3,1)
....
1.可以看到19=3×4+1×7,也可以看成在12的基础上加7,因此可以从前往后枚举每一个能组成的数(后面依靠前面的结果),枚举到足够大的数。

大于17的任何数字都可以用4和7组合出来。

2.然后再根据上面的话,从后往前找到第一个不能被组合的数就是答案了

采用数组查询会比递归暴搜时间复杂度低一些

`#include<stdio.h>
#define MAXN 1000000

int dp[MAXN];

int main()
{
int n,m;

scanf("%d%d",&n,&m);

dp[0]=1;

for(int i=0;i<MAXN;i++){
    
     if(dp[i-n]&&i>=n||dp[i-m]&&i>=m) dp[i]=1;//加i>=n和i>=m防止下标越界
}
   
for(int i=MAXN-1;i>0;i-=2)//以2为单位递减是因为后来发现结果都是奇数
{
	if(!dp[i])
	{
		printf("%d",i);
		break;
	}
}

return 0;
}

`


根据暴力枚举的结果,输入数据,确定了最大不能组合数,我们来总结规律

n m i
2 3 1 i=(2-1)*m-2
2 5 3
2 7 5
2 9 7
2 11 9
2 13 11

3 2 1 i=(3-1)*m-3
3 4 5
3 5 7
3 7 11
3 8 13
3 10 17
3 11 19
3 13 23

4 3 5 i=(4-1)*m-4
4 5 11
4 7 17
4 9 23
4 11 29
4 13 35
4 15 41

5 2 3 i=(5-1)*m-5
5 3 7
5 4 11
5 6 19
5 7 23
5 8 27
5 9 31
5 11 39
5 12 43

111 400 43889 i=(111-1)*m-111
111 398 43669
111 397 43559
111 395 43339
111 394 43229

得出结论:由n和m最大不能组成数i=(n-1)*m-n

`      
#include<stdio.h>
int main(){
int n,m;

scanf("%d%d",&n,&m);

printf("%d",(n-1)*m-n);

return 0;
}

`

暴力枚举与总结规律——买不到的数目

原文:https://www.cnblogs.com/wangyafeidr/p/14386759.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!