1226 包子湊數

2022-09-21 20:30:20 字數 1675 閱讀 6956

給出 \(n\) 個數 \(a_i\),求有多少個數不能通過這些數湊出

第一行包含乙個整數 \(n\)。

接下來 \(n\) 行,每行包含乙個整數 \(a_i\)。

輸出乙個整數代表答案。

如果湊不出的數目有無限多個,輸出inf。

資料範圍

\(1≤n≤100,\)

\(1≤a_i≤100\)

輸入樣例1:

2

45

輸出樣例1:
6
輸入樣例2:
2

46

輸出樣例2:
inf
樣例解釋

對於樣例1,湊不出的數目包括:\(1, 2, 3, 6, 7, 11\)。

對於樣例2,所有奇數都湊不出來,所以有無限多個。

數論,完全揹包變形

結論:對於兩個互斥的數 \(a,b\),其不能湊出的最大的數為 \((a-1)\times (b-1)-1\)

\(99\) 和 \(98\) 是 \(100\) 內最大的互斥的兩個數可以考慮最大的數取 \(10000\),由於再有更多的數的話可選擇的數更多,最大的數可能還不止\(10000\),同時,如果 \(n\) 個的數的最大公約數不為 \(1\),則其湊不出來的數有無限個,因為這些數可以約數不為該最大公約數

\(\color\),在 \(100\) 範圍內這樣的情況很難出現,且題目應該是保證有解的,所以這種情況可以忽略

下面的問題就變成了完全揹包問題:

// problem: 包子湊數

// contest: acwing

// url:

// memory limit: 64 mb

// time limit: 1000 ms

// // powered by cp editor (

// %%%skyqwq

#include //#define int long long

#define help

#define pb push_back

#define fi first

#define se second

#define mkp make_pair

using namespace std;

typedef long long ll;

typedef pairpii;

typedef pairpll;

template bool chkmax(t &x, t y)

template bool chkmin(t &x, t y)

template void inline read(t &x)

while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();

x *= f;

}const int n=105;

int n,a[n];

bool f[n][n*n];

int main()

if(d!=1)puts("inf");

else

int res=0;

for(int i=0;icout<}

return 0;

}

複雜DP 1226 包子湊數問題

小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有 n 種蒸籠,其中第 i 種蒸籠恰好能放 ai 個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買 x 個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有 x 個包子。比如一共有 3 種蒸籠,分別能放 3 4 ...

包子湊數 完全揹包

小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有n種蒸籠,其中第i種蒸籠恰好能放ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買x個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有x個包子。比如一共有3種蒸籠,分別能放3 4和5個包子。當顧客想買11個...

歷屆試題 包子湊數 真 湊數)

問題描述 小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有n種蒸籠,其中第i種蒸籠恰好能放ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買x個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有x個包子。比如一共有3種蒸籠,分別能放3 4和5個包子。當顧客...