給出 \(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,所有奇數都湊不出來,所以有無限多個。
數論,完全揹包變形\(99\) 和 \(98\) 是 \(100\) 內最大的互斥的兩個數可以考慮最大的數取 \(10000\),由於再有更多的數的話可選擇的數更多,最大的數可能還不止\(10000\),同時,如果 \(n\) 個的數的最大公約數不為 \(1\),則其湊不出來的數有無限個,因為這些數可以約數不為該最大公約數結論:對於兩個互斥的數 \(a,b\),其不能湊出的最大的數為 \((a-1)\times (b-1)-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個包子。當顧客...