ACM题目1427: [2013年第四届真题]买不到的数目

题目描述

小明开了一家糖果店。他别出心裁:把水果糖包成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;
}

  

posted @ 2020-09-23 16:37  进寸欢喜  阅读(228)  评论(0编辑  收藏  举报