正文

一道有意思的题目2009-12-09 14:23:00

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

分享到:

将0到9这十个数字分成n组,每一组的数字之和等于输入的数,输入的数的个数等于n。例如:输入:40  5则程序需要把这十个数字分成两组,第一组所有数字之和为40,第二组之和为5。所以有:输出:0 1 2 3 4 6 7 8 95 #include <iostream>using namespace std;int main(){    const int N_OF_DIGITS=9;    const int TOTAL_COMBS=512;    const int MAX_NUM_GROUP=9;    int bin[N_OF_DIGITS]={0};    int digits_record[N_OF_DIGITS]={0};    int digits[]={1,2,3,4,5,6,7,8,9};    int sum_of_combs[TOTAL_COMBS]={0};    int groups_sums[MAX_NUM_GROUP];    int comb_indices[MAX_NUM_GROUP]={0};    int n_of_groups;    int i,j,k;    void dec2bin(int n,int *arr);    int IsOverlap(int arr1[],int arr2[],int size);    void SetRecord(int arr1[],int arr2[],int size);        cout<<"input number of groups:\n";    cin>>n_of_groups;        cout<<"input the sum of each group (in ascend order):\n";    for(i=0;i<n_of_groups;i++)        cin>>groups_sums[i];    for(i=0;i<TOTAL_COMBS;i++)    {        for(j=0;j<N_OF_DIGITS;j++)            bin[j]=0;        dec2bin(i,bin);                for(j=0;j<N_OF_DIGITS;j++)            sum_of_combs[i]+=digits[j]*bin[j];    }    for(i=0;i<n_of_groups;i++)    {        for(j=0;j<TOTAL_COMBS;j++)        {            if(sum_of_combs[j]==groups_sums[i])            {                for(k=0;k<N_OF_DIGITS;k++)                    bin[k]=0;                dec2bin(j,bin);                if(!IsOverlap(digits_record,bin,N_OF_DIGITS))                {                    SetRecord(digits_record,bin,N_OF_DIGITS);                    comb_indices[i]=j;                    break;                }            }        }    }    for(i=0;i<n_of_groups;i++)    {        cout<<"numbers in group "<<i+1<<":"<<endl;        for(k=0;k<N_OF_DIGITS;k++)            bin[k]=0;        dec2bin(comb_indices[i],bin);        for(k=0;k<N_OF_DIGITS;k++)        {            if(bin[k]==1)                cout<<bin[k]*digits[k]<<' ';        }        putchar('\n');    }    system("pause");    return 0;}void dec2bin(int n,int *arr){    if(n>0)    {        *arr=n%2;        dec2bin(n/2,arr+1);    }}int IsOverlap(int arr1[],int arr2[],int size){    for(int i=0;i<size;i++)        if(arr1[i]==1 && arr2[i]==1)            return 1;    return 0;}void SetRecord(int arr1[],int arr2[],int size){    for(int i=0;i<size;i++)        arr1[i]+=arr2[i];}要求输入的数据从小到大,数据有解,0可以在任意一组出现所以就没考虑就是1~9。没解的算不了。测试了下,应该没问题:input number of groups:4input the sum of each group (in ascend order):7 11 12 15numbers in group 1:1 2 4numbers in group 2:5 6numbers in group 3:3 9numbers in group 4:7 8

阅读(1286) | 评论(0)


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

评论

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