小明买书

来源:互联网 发布:计价软件 编辑:程序博客网 时间:2024/06/06 00:01
小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别为:3.1,1.7,2,5.3,0.9和7.2。不巧的是,小明的爸爸只带了十几块钱,为了让小明过一个愉快的假期,爸爸扔然同意买书,但提邮购一个要求,要小明从六本书中选出若干本,使得单价相加所得的和同10最接近。你能够帮助小明解决这个问题吗?


*问题分析与算法设计
分析题意,可将题目简化为:从六个数中选出若干个求和,使得和与10的差值最小。
题目中隐含两个问题,其一是怎样从六个数中选出若干个数;其二是求与10的差。
从六个数中选出若干个数实质是从六个数中选出若干个进行组合。每个数在组合过程中只有两种情况:要么是选中参加求和,要么是没选中不参加求和。这样就可以使用六重循环对每个数是否参加求和进行全部可能情况的组合。

关于求与10的差值应当注意的是:差值的含义是指差的绝对值。例如:“9-10=-1"和"11-10=1",但9和11这两者与10的差值都是1。若认为”9“与”10的差值为-1就错了。

#include <stdio.h>#include <math.h>int main(){    int d[6], m, i, j;    long b[63], flag;    float c[6], min, x;    printf("Please enter the prices of 6 books:");    for (i = 0; i < 6; i++)         scanf("%f", &c[i]);     for ( i = 0, min = -1, d[0] = 0; d[0] < 2; d[0]++)       for (d[1] = 0; d[1] < 2; d[1]++)         for (d[2] = 0; d[2] < 2; d[2]++)             for (d[3] = 0; d[3] < 2;d[3]++)               for (d[4] = 0; d[4] < 2; d[4]++)                for (d[5] = 0; d[5] < 2; d[5]++)                {                    for (flag = 0, x = 0, j = 5; j >= 0; j--)                     {                        x += c[j]*d[j];                        flag = flag*10 + d[j];                    }                    x = ((x - 10 > 0) ? x - 10 : 10 - x);                     if (min < 0)                    {                        min = x;                        b[i++] = flag;                     }                    else if (min - x > 1.e-6)                     {                        min = x;                        b[0] = flag;                        i = 1;                    }                        else if (fabs((double)x - min) < 1.e-6)                        {                            b[i++] = flag;                        }                 }    for (m = 0; m < i; m++)     {        printf("10(+ -)%.2f=", min);        for (flag = b[m], j = 0; flag > 0; j++, flag /= 10)            if (flag % 10)             {                    if (flag > 1)                {                    printf("%.2f+", c[j]);                }                else                {                    printf("%.2f\n", c[j]);                }             }    }    return 0;}
Please enter the prices of 6 books:3.1 1.7 2.0 5.3 0.9 7.2
10(+ -)0.10=2.00+0.90+7.20
10(+ -)0.10=1.70+2.00+5.30+0.90
10(+ -)0.10=3.10+1.70+5.30


原创粉丝点击