小明开了一家糖果店。他别出心裁:
小朋友来买糖的时候,他就用这两种包装来组合。
你可以用计算机测试一下,在这种包装情况下,
本题的要求就是在已知两个包装的数量时,
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
资源约定:
峰值内存消耗 <64M
思路:比如 4 和 7 时,4 和 7 是必胜态, 1, 2, 3, 5, 6 是必败态,当糖果数大于7时, 每次只需判断两种情况即可判断出它是必胜态还是必败态:-4 和 -7
之后是必胜还是必败态,当走到后面的时候,前面这两种情况一定是已经算好的。
注意:若输入4 和16, 4 和16之间的数字也有可能能够组合出来,所以要从输入的两个数中最小的开始算。并且每次算之前确保它比要减去的数字大。
#include<stdio.h>
#include<string.h>
int main(){
int flag, a[1010], m, n, i, len, min;
scanf("%d %d", &m, &n);
memset(a, 0, sizeof(a));
a[m] = a[n] = 1;
min = m < n ? m : n;
for(i = min; i < 1001; i++){
flag = 0;
if(i >= m && a[i - m] == 1)
flag = 1;
if(i >= n && a[i - n] == 1)
flag = 1;
if(flag == 1)
a[i] = 1;
}
for(i = 1000; i >= 0; i --){
if(a[i] == 0){
len = i;
break;
}
}
printf("%d\n", len);
return 0;
}
CPU消耗 < 3000ms