正文

做了下07清华计算机考研上机第三题2009-12-10 17:05:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/shenjinggege/50339.html

分享到:

今天试了下,刚好半个小时做完哦 第三题(可执行文件名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张。

阅读(2410) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册