问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
思路:1.动态规划,其实也就是递推,设一个足够大的数组vis,vis[i]为1表示可以表示,vis[i]为0不可以表示,一个数是够能表示可以根据i - x或i - y是否可以被表示,当有一个数不能被表示时,他后面连续max(x,y)个数可以被表示,则这个数就是答案
2.emmm
一个结论?答案就是x * y - x - y
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn = 1e7 + 10;
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int vis[maxn];
int main()
{
int x,y;
scanf("%d%d",&x,&y);
memset(vis,0,sizeof(vis));
vis[x] = vis[y] = 1;
if(x > y) swap(x,y);
bool sign = false;
int i,cnt = 0;
for(i = 1; ; i++)
{
if(!vis[i])
{
if(i > y)
{
if(vis[i - x] || vis[i - y]) vis[i] = 1;
}
else if(i > x) vis[i] = vis[i - x];
}
if(sign = false && !vis[i]) sign = true;
else if(sign = true)
{
if(!vis[i])
{
sign = false;
cnt = 0;
}
else cnt++;
}
if(cnt == y) break;
}
printf("%d\n",i - y);
return 0;
}
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn = 1e7 + 10;
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int main()
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",x * y - x - y;
return 0;
}