最小郵票數

2021-08-28 14:44:34 字數 1043 閱讀 4951

有若干張郵票,要求從中選取最少的郵票張數湊成乙個給定的總值。     如,有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
本題為典型的dfs題,資料量不大,可以直接用深度搜尋解決,當然在進行搜尋的過程中要注意剪枝和更新構成郵票的數量。

一、遇到以下情況我們停止搜尋:

1、當郵票總值s>n的時。

2、當s == n 的時候,我們把郵票數number 更新成 min(number,num),然後停止搜尋。

3、當選到最後一張郵票時,停止搜尋;

4、當當前所選的郵票數大於以及能夠組合成n面值的郵票數數量時,停止搜尋。

二、dfs以後,我們對number進行判斷,為-1時輸出0,否則輸出我們的dfs值。

#include #include #include #include#define rep(i,s,e) for(int i = s;itoken;

void init(int n,int s)

void addtoken(int n)

int dfs(int x,int s,int number)else

}if(x>=num)

rep(i,x,num)

number--;

s-=a[i];

}return 0;

}int getdfs()

};int main()

int t = so.getdfs();

if(t!=-1)

cout

}

最小郵票數

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 1680 解決 558 題目描述 有若干張郵票,要求從中選取最少的郵票張數湊成乙個給定的總值。如,有1分,3分,3分,3分,4分五張郵票,要求湊成10分,則使用3張郵票 3分 3分 4分即可。輸入 有多組資料,對於每組資料,首先是要求湊成的...

最小郵票數

題目描述 有若干張郵票,要求從中選取最少的郵票張數湊成乙個給定的總值。如,有1分,3分,3分,3分,4分五張郵票,要求湊成10分,則使用3張郵票 3分 3分 4分即可。輸入 有多組資料,對於每組資料,首先是要求湊成的郵票總值m,m 100。然後是乙個數n,n 20,表示有n張郵票。接下來是n個正整數...

最小郵票數

有若干張郵票,要求從中選取最少的郵票張數湊成乙個給定的總值。如,有1分,3分,3分,3分,4分五張郵票,要求湊成10分,則使用3張郵票 3分 3分 4分即可。有多組資料,對於每組資料,首先是要求湊成的郵票總值m,m 100。然後是乙個數n,n 20,表示有n張郵票。接下來是n個正整數,分別表示這n張...