計算機考研複試真題 最小郵票數

2022-06-27 20:36:12 字數 956 閱讀 2048

有若干張郵票,要求從中選取最少的郵票張數湊成乙個給定的總值。     如,有1分,3分,3分,3分,4分五張郵票,要求湊成10分,則使用3張郵票:3分、3分、4分即可。

有多組資料,對於每組資料,首先是要求湊成的郵票總值m,m<100。然後是乙個數n,n〈20,表示有n張郵票。接下來是n個正整數,分別表示這n張郵票的面值,且以公升序排列。
對於每組資料,能夠湊成總值m的最少郵票張數。若無解,輸出0。
示例1

10

51 3 3 3 4

3

/*

程式設計思路:0-1最小揹包問題

方法大概類似於篩選法,題目中已經給出有序,不需要再次排序,對於每乙個郵票來說,有且僅有一次使用機會。

所以遍歷所有郵票,獲取郵票的面值,對於每乙個dp陣列來說,dp[i]中的i代表總值,dp[i]中儲存的資料為個數,

遍歷所有小於等於m的i,如果總值減去當前所選的郵票的面值,即i-c[i]合法並且可達,那麼i一定可達,

並且dp[i]中的值應該是dp[i-c[i]]的值+1和原來的值中較小的乙個。

第二層迴圈為什麼要倒序?因為設想假如正序的話,現在有一張郵票的價值為1,dp[1]會使用到1,

dp[2]=min(dp[2],dp[1]+1),這樣就相當於使用了兩次價值為1的郵票,與題意顯然不符合,因此第二層迴圈一定要倒序。

*/#include

#include

#define mmax 0x7fffffff

using

namespace

std;

int min(int a,int b)

intmain()}}

if(dp[m]==mmax)

cout

<<0

cout

}}

計算機考研複試真題 階乘

輸入n,求y1 1 3 m m是小於等於n的最大奇數 y2 2 4 p p是小於等於n的最大偶數 每組輸入包括1個整數 n可能有多組測試資料,對於每組資料,輸出題目要求的y1和y2示例1 4 7 26 解題思路 1.寫乙個求某一數字m的階乘函式。2.對於輸入的n進行最大奇數和偶數的確定,確定方法 若...

計算機考研複試真題 手機鍵盤

按照手機鍵盤輸入字母的方式,計算所花費的時間 如 a,b,c都在 1 鍵上,輸入a只需要按一次,輸入c需要連續按三次。如果連續兩個字元不在同乙個按鍵上,則可直接按,如 ad需要按兩下,kz需要按6下 如果連續兩字元在同乙個按鍵上,則兩個按鍵之間需要等一段時間,如ac,在按了a之後,需要等一會兒才能按...

計算機考研複試真題 統計單詞

編乙個程式,讀入使用者輸入的,以 結尾的一行文字,統計一共有多少個單詞,並分別輸出每個單詞含有多少個字元。凡是以乙個或多個空格隔開的部分就為乙個單詞 輸入包括1行字串,以 結束,字串中包含多個單詞,單詞之間以乙個或多個空格隔開。可能有多組測試資料,對於每組資料,輸出字串中每個單詞包含的字母的個數。示...