小明买书

题目:

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


猜你喜欢

转载自blog.csdn.net/shb8845369/article/details/26531831