小明买书

来源:互联网 发布:linux intel 核显 编辑:程序博客网 时间:2024/06/05 20:38

题目:

小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别为:3.1,1.7,2,5.3,0.9和7.2。不巧的是,小明的爸爸只带了十几块钱,为了让小明过一个愉快的假期,爸爸仍然同意买书,但提出一个要求,要小明从六本书中选出若干本,使得单价相加所得的和同10最接近。


自己编写的程序如下,主要是求排列组合总数,并利用2进制的特性,将各个单价与二进制位1~6bit一一对应:

<span style="font-size:18px;">#include "stdafx.h"#include <iostream>#include <math.h>using namespace std;void PrintAll();float booksPrice[] = {3.1f, 1.7f, 2.0f, 5.3f,0.9f, 7.2f};int main(int argc, char* argv[]){float sumOfPrice[64];for(int m=0; m<64; m++){sumOfPrice[m] = 0.0f;}for(int i=0; i<64; i++){int j = i;int testNumber = i;int bitPosition = 0;while(testNumber){if(testNumber%2!=0)sumOfPrice[j] += booksPrice[bitPosition];bitPosition++;testNumber = testNumber>>1;}}int minIndex = 1;float tmpSum[64];for(int k=1; k<64; k++){tmpSum[k] = sumOfPrice[k] - 10.0f;tmpSum[k] = fabs((double)tmpSum[k]);if(tmpSum[k] <= tmpSum[minIndex])minIndex = k;//cout<<sumOfPrice[k]<<endl;}cout << "\nminIndex = "<<minIndex<<endl;int minNumber = minIndex;float res = 0.0f;int bitPos = 0;cout<<"最小的组合: "<<endl;while( minNumber ){if(minNumber % 2 != 0){cout<<booksPrice[bitPos]<<"+"<<" ";res += booksPrice[bitPos];}bitPos++;minNumber = minNumber>>1;}cout <<"\b\b  = " <<res<<endl<<endl;cout <<"以下是其他可能的组合:"<<endl;PrintAll();return 0;}void PrintAll(){int flagArray[64][6];for(int x=0; x<64; x++)for(int y=0; y<6; y++){flagArray[x][y] = 0;}for(int i=1; i<64; i++){int bitPosition =0;int testNumber = i;while(testNumber){if(testNumber %2 != 0){flagArray[i][bitPosition] = 1;}bitPosition++;testNumber = testNumber>>1;}}for(int m=1; m<64; m++){float sum=0.0f;for(int n=0; n<6; n++){if(flagArray[m][n] == 1){cout<<booksPrice[n]<<"+"<<" ";sum += booksPrice[n];}}cout<<"\b\b = "<<sum<<endl;}}</span>


0 0
原创粉丝点击