蓝桥杯- 包子凑数
一:題目
題目描述
小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有 NN 種蒸籠,其中第 ii 種蒸籠恰好能放 A_iA
i
?
個包子。每種蒸籠都有非常多籠,可以認為是無限籠。
每當有顧客想買 XX 個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有 XX 個包子。比如一共有 3 種蒸籠,分別能放 3、4 和 5 個包子。當顧客想買 11 個包子時,大叔就會選 2 籠 3 個的再加 1 籠 5 個的(也可能選出 1 籠 3 個的再加 2 籠 4 個的)。
當然有時包子大叔無論如何也湊不出顧客想買的數量。比如一共有 3 種蒸籠,分別能放 4、5 和 6 個包子。而顧客想買 7 個包子時,大叔就湊不出來了。
小明想知道一共有多少種數目是包子大叔湊不出來的。
輸入描述
第一行包含一個整數 NN (1 \leq N \leq 1001≤N≤100)。
以下 N 行每行包含一個整數 A_iA
i
?
(1 \leq A_i \leq 1001≤A
i
?
≤100)。
輸出描述
一個整數代表答案。如果湊不出的數目有無限多個,輸出 INF。
樣例說明
所有奇數都湊不出來,所以有無限多個
二:上碼
/**思路:1.分析題意 題目給出了幾個數找出這幾個數目湊不出來的數有幾個2.動態規劃1>:確定dp是什么,以及下標是什么dp[j]表示的是包子個數是j, 是否可以被籠子里的包子的個數湊出 2>:確定dp的遞推公式是什么 dp[j] = dp[j]; dp[j] = dp[j - nums[i]];//其中nums[i]表示的是籠子里的包子個數 //j就是表示出的是我們的可以湊出的包子個數 3>:初始化初始化為false; 4>:確定遍歷順序外層遍歷物品(也就是給出的籠子里的包子個數)里層遍歷物品重量(也就是我們可以湊出包子的個數)for (int i = 1; i <= N; i++) {for (int j = nums[i]; j <= M; j++) {//這里從j = nums[i]開始,是怕出現負數 dp[j] = dp[j-nums[i]; }}5>:模擬 */#include<bits/stdc++.h> using namespace std;int main() {int N;vector<bool>dp(10005,0);int count1 = 0;int count2 = 0;cin >> N;vector<int> nums(N);for (int i = 0; i < N; i++) {cin >> nums[i];if(i == 0) {count1 = nums[i];}else{count1 = __gcd(count1,nums[i]);//求取最大公約數,如果最終求出的公約數大于1,說明不互質}} // cout << count1 << "wyj";if(count1 > 1) {cout << "INF"; return 0;}dp[0] = 1;for (int i = 0; i < N; i++) {//遍歷背包 for (int j = nums[i]; j <= 10005; j++) {//遍歷物品 也就是我們包子的個數 dp[j] = dp[j-nums[i]] | dp[j]; // cout << dp[j] << ' ';} // cout << endl;} // for (int j = 1; j <= 10; j++) {//遍歷物品 也就是我們包子的個數 // cout << dp[j] << " "; // } for(int i = 1; i <= 10005; i++) {if(dp[i] == 0) count2++;}cout << count2; }總結
- 上一篇: java并发之synchronized实
- 下一篇: leetcode209. 长度最小的子数