ACM题目1427: [2013年第四届真题]买不到的数目
题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出
一个正整数,表示最大不能买到的糖数
样例输入
4 7
样例输出
17
下面的代码是自己编出来的:编译以后 不出现结果
#include<stdio.h>
int main()
{
int i=0,j=0;
int a,b;
int num=0;
scanf("%d%d",&a,&b);//a,b用来接收输入的两个糖果的数目
for(i=1;i<1000;i++)
{
for(j=1;j<1000;j++)
{
num=a*i+b*j;
num=num+1;
if(num==a*i+b*j)
{
printf("%d",num);
}
}
}
return 0;
}
编译结果:
正确的方法是利用动态规划的方法去解决这道题
动态规划问题三要素:
1)问题的阶段
2)每个阶段的状态
3)从前一个阶段到后一个阶段之间的递推关系
具体方法就不再这里说了,内容很多,下去需要好好多加联系dp的题目
代码:
#include<stdio.h>
#define N 200000
int main()
{
int i,max=0;
int n,m;
int f[N]={0};
f[0]=1;
scanf("%d%d",&n,&m);
f[n]=1,f[m]=1;
i=n>m?n:m;
for(;i<=N;i++)//要判断哪个数是不能组合,就考虑它前面的数f[i-n]==1和f[i-m]==1)能不能组合
{
if(f[i-n]==1||f[i-m]==1)//动态规划,比如n=4,m=7时,让i从7开始
f[i]=1;//让i从7一直增加到N,然后看看哪一个数是不能组合的
else
max=i;//如果它不能组合就标记它
}
printf("%d\n",max);
return 0;
}