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; }
还以一种方法可以通过公式来直接计算出结果,不过推导过程不会,多写几组数据应该可以找到规律
永远渴望,大智若愚(stay hungry, stay foolish)