有若干張郵票,要求從中選取最少的郵票張數湊成乙個給定的總值。 如,有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張...