1232: 买不到的数目 [DP、数学]

1232: 买不到的数目 [DP、数学]

时间限制: 1 Sec 内存限制: 128 MB

提交: 21 解决: 10 统计

题目描述

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买  10  颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入

两个正整数,表示每种包装中糖的颗数(不超过1000)

不需要考虑无解的情况

输出

一个正整数,表示最大不能买到的糖数

样例输入

4 7
3 5

样例输出

17
7

虽然上面提示的是dp,但是自己想了一下,还是没想到怎么用dp来解这道题,后来看了看别人的bolg,发现这个题的测试数据较小,所以可以用枚举的方法来找到答案

#include<stdio.h>
#include<string.h>
#include<algorithm>
const int maxn = 1000005;

using namespace std;

int dp[maxn];//dp[i][j]表示在前i个数中,总重量不超过j的最大价值

int main()
{
    int n, m, sum, ans;

    while(scanf("%d %d", &n, &m) != EOF)
    {
        memset(dp, 0, sizeof(dp));

        for(int i = 0; i*n <= n*m; i++)
        {
            for(int j = 0; j*m <= n*m; j++)
            {
                sum = i*n + j*m;
                dp[sum] = 1;
            }
        }

        for(int k = n*m; k > 0; k--)
        {
            if(dp[k] == 0)
            {
                ans = k;
                break;
            }
        }

        printf("%d\n", ans);
    }

    return 0;
}
View Code

 

还以一种方法可以通过公式来直接计算出结果,不过推导过程不会,多写几组数据应该可以找到规律

 

posted @ 2017-12-26 13:44  Veritas_des_Liberty  阅读(231)  评论(0编辑  收藏  举报