给定一个数组,按序排列,从数组找出若干个数,使得这若干个数字的和与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(" *********** ");
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 在排序数组中查找和为给定值的两个数字
- 下一篇: Java实现二分法查找