试题 历届试题 买不到的数目(dp、数学)
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
思路
1.观察两个数为互质数,开一个dp数组,标志dp[0]=1,dp[n]=1,dp[m]=1;
从1枚举到n*m(gcd=1,相当于lcm(n,m)),当dp[i-n]=1 or dp[i-m]=1有dp[i]=1;比n*m大的数一定可以组合得到。
code:
#include<bits/stdc++.h>
using namespace std;
int dp[1000005];
int main(){
int n,m;
cin>>n>>m;
dp[0]=1;dp[n]=1;dp[m]=1;
for(int i=1;i<=n*m;i++){
if(i>n&&dp[i-n]||i>m&&dp[i-m]){
dp[i]=1;
}
}
for(int i=n*m;i>=1;i--){
if(!dp[i]){
cout<<i<<endl;
break;
}
}
return 0;
}
2.数论结论,扩展欧几里得自然数a,b互质,则不能表示成ax+by(x,y为非负整数)的最大整数是ab-a-b.
简单证明用反证法,假设ax+by=ab-a-b,有ab=an+bm;
ab是a的倍数,an是a的倍数,则bm需是a的倍数,只能是m是a的倍数;bm=bm'a>=ab,又a>1,b>1,矛盾。