AcWing 1205. 买不到的数目

题面:
水果糖被包成 n 颗一包和 m 颗一包的两种,用这两种包装来组合,不能拆包卖。
4 颗一包和 7 颗一包的情况下,最大不能买到的数量是 17
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

原题链接:1205. 买不到的数目 - AcWing

数论:组合数学

存在两个正整数 pq,有这样一个组合 xp+yqx 倍的 py 倍的 q),
试问其无法组成的数中最大的一个是?

标准解法:裴蜀定理
公式:(p1)(q1)1

然而,关于数论题,当我们对该题涉及的公式没有概念时,如何突破困境?

分析思路

是否有解:考虑最大公约数(gcd)

pq 存在最大公约数 d 时,能组合出的数一定是 d 的倍数。

打表找规律

#include<bits/stdc++.h>
using namespace std;
//暴力法一:(6/11)
bool dfs(int i, int n, int m) {
//如果余数为0,则可以组合
if (!i) return true;
if (i >= n && dfs(i - n, n, m)) return true;
if (i >= m && dfs(i - m, n, m)) return true;
return false;
}
int main()
{
int n, m;
cin >> n >> m;
int res = 0;
//设一个较大数(此处为1000),若超过就认为其有解
for (int i = 1; i <= n * m; i++)
if (!dfs(i, n, m)) res = i;
cout << res << endl;
}
//暴力法二:(9/11)
int main()
{
int n, m;
bool flag;
cin >> n >> m;
int res = min(n, m) - 1;
for (int i = min(n, m); i < n * m; i++) {
flag = false;
for (int j = 0; j * n <= i; j++) {
if ((i - j * n) % m == 0) {
flag = true;
break;
}
}
if (!flag) res = i;
}
cout << res;
}

简单DP优化

如果 i 可以被组合出来,那么 inim 一定可以被组合出来。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n, m, res = 1;
bool dp[N];
int main()
{
cin >> n >> m;
dp[0] = true;
if (n > m) swap(n, m);
for (int i = n; i < n * m; i++) {
if (dp[i - n])
dp[i] = true;
else if (i >= m && dp[i - m])
dp[i] = true;
else res = i;
}
cout << res;
}

  1. AcWing 1205. 买不到的数目(dp版) - AcWing ↩︎

posted @   蒟蒻爬行中  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示