给定一个数组,按序排列,从数组找出若干个数,使得这若干个数字的和与M最为接近,(背包问题)

思路:对于数组中的每一个数,观察它们取或不取对最后结果的影响。并且记录下若干数字的和与M的差的绝对值最小时所取到的若干数字。

/*
 * 微软100, 9月28题, 输入和接近M
 * sum 即为M值
 * num排序的数组
 * len数组长度
 * vec所取到若干数字构成的向量
 * currentSum vec中的数字的和
 */
int diff = INT_MAX;
vector<int> minVec;
void FindAppM(int sum, int currentSum,int num[], int len, int i, vector<int>& vec)
{
	if(i >= len)
		return;

	//
	if(abs(currentSum - sum) < diff)
	{
		diff = abs(currentSum - sum);
		minVec = vec;
	}

	vec.push_back(num[i]);
	FindAppM(sum, currentSum+num[i],num, len, i+1, vec);
	vec.pop_back();
	FindAppM(sum, currentSum,num, len, i+1, vec);
}


int main() {
	vector<int> sumVec1;
	int num123[5] = {1,2,6,12,51};
	FindAppM(4, 0, num123, 5, 0, sumVec1);
	for(int i=0; i<minVec.size(); i++)
	{
		cout<<minVec[i]<<"*";
	}
	printf("\n***********\n");
转载:https://blog.csdn.net/tom555cat/article/details/39186931

猜你喜欢

转载自blog.csdn.net/dongyu_1989/article/details/80742900