今天试了下,刚好半个小时做完哦 第三题(可执行文件名program3.exe)有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。首先是要求凑成的邮票总值M,M<100然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。输出:能够凑成总值M的最少邮票张数。若无解,输出0。样例输入:10 5 1 3 3 3 4样例输出:3 #include <iostream>using namespace std;int main(){ int sum; int num; int num_of_combs=1; int sum_try; int num_need=0; cout<<"输入邮票总值:"; cin>>sum; cout<<"输入邮票张数:"; cin>>num; int *p=new int[num]; int *digits=new int[num]; cout<<"输入邮票面值(从小到大):\n"; for(int i=0;i<num;i++) cin>>*(p+i); for(int i=0;i<num;i++) num_of_combs*=2; void dec2bin(int n,int *arr); for(int i=0;i<num_of_combs;i++) { sum_try=0; for(int j=0;j<num;j++) *(digits+j)=0; dec2bin(i,digits); for(int k=0;k<num;k++) if(*(digits+num-1-k)==1) sum_try+=*(p+k); if(sum_try==sum) break; } for(int i=0;i<num;i++) num_need+=*(digits+i); cout<<"最少需要邮票"<<num_need<<"张。"<<endl; delete digits; delete p; return 0;}void dec2bin(int n,int *arr){ if(n>0) { *arr=n%2; dec2bin(n/2,arr+1); }}测试一: 输入邮票总值:10输入邮票张数:5输入邮票面值(从小到大):1 3 3 3 4最少需要邮票3张。输入邮票总值:99 测试二: 输入邮票张数:19输入邮票面值(从小到大):1 3 5 6 7 9 11 13 15 22 35 43 48 57 64 77 85 88 97最少需要邮票2张。

评论