买不到的数目 蓝桥杯 动态规划

本文探讨了在特定糖果包装条件下,求解最大不能组合出的糖果数量问题。通过暴力法、公式法和动态规划三种方法,展示了如何利用不同的算法策略解决同一数学问题。文章提供了详细的代码实现,适合算法初学者和编程爱好者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)

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

样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7

这题目提示为动态规划和数论,一开始就在琢磨是不是一个找规律的问题,后来一想我们写程序,不就是利用电脑来帮助人类完成那些我们认为繁琐的事情吗?所以我就放弃了寻找规律这一方向,转向使用电脑工具(暴力方法。。。。)我看了一些别人的文章,大概这题目有三种方式。

一:暴力法

#include <iostream>  
#include <cstring>  
#include <algorithm>  
#define MAXN 1000001  
using namespace std;  
int vis[MAXN];  
int main(void) {  
    int a, b;  
    cin >> a >> b;  
    int maxn = a * b;  
    memset(vis, 0, sizeof(vis));  
    for(int i = 0; i * a <= maxn; i++) {  
        for(int j = 0; j * b <= maxn; j++) {  
            if(i * a + j * b > maxn) {  
                break;  
            }  
            vis[i * a + j * b] = 1;  
        }  
    }  
    for(int i = maxn; i > 0; i--) {  
        if(vis[i] == 0) {  
            cout << i << endl;  
            break;  
        }  
    }  
    return 0;  
} 

二:公式法

假设第一种包装中糖的颗数为a,第二种包装中糖的颗数为b,则最大不能组合出的数字为a * b - a - b。

em。。这个公式是数论中的,但是我也没证明过,所以我也不知道怎么回事。

#include <iostream>  
using namespace std;  
int main(void) {  
    int a, b;  
    cin >> a >> b;  
    cout << a * b - a - b << endl;  
    return 0;  
}  

三、动态规划方法

建立dp数组,而且大概能知道两数字最大范围。

#include <bits/stdc++.h>
using namespace std;
int a,b;//输入的两个数字
int dp[100000];
int main ()
{
	memset(dp,0,sizeof(dp));
	while (cin>>a>>b)
	{
		dp[a]=1;
		dp[b]=1;
		for(int i=max(a,b)+1;i<a*b;i++)
		{
			if(dp[i-a]||dp[i-b])
			dp[i]=1;
		}
		for(int i= a*b-1;i>0;i--)
		{
			if(!dp[i])
			{
			cout<<i<<endl;
			break;
		    }
		}
	}
	return 0;
} 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值