题目:
小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别为: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>