1. 程式人生 > >給定一個數組,按序排列,從陣列找出若干個數,使得這若干個數字的和與M最為接近,(揹包問題)

給定一個數組,按序排列,從陣列找出若干個數,使得這若干個數字的和與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");


相關推薦

給定個數排列陣列若干個數使得若干數字M最為接近揹包問題

思路:對於陣列中的每一個數,觀察它們取或不取對最後結果的影響。並且記錄下若干數字的和與M的差的絕對值最小時所取到的若干數字。 /*  * 微軟100, 9月28題, 輸入和接近M  * sum 即為M值  * num排序的陣列  * len陣列長度  * vec所取到若干數

給定一個實數陣列排列從小到大,陣列若干個數使得若干個數M最為接近描述一個演算法並給演算法的複雜度。

有N個正實數(注意是實數,大小升序排列) x1 , x2 ... xN,另有一個實數M。 需要選出若干個x,使這幾個x的和與 M 最接近。 請描述實現演算法,並指出演算法複雜度。 #define M

快速個數中的兩數字數字之和等於一個給定的值

http 知識 繼續 進一步 repl 有一個 tails 窮舉 too 我覺得寫得很清晰,希望沒有侵犯作者的著作權,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一個數組中的兩個數字,讓這

陣列中的兩數字如果前面一個數字大於後面的數字數字組成一個逆對。輸入個數,求這個陣列中的逆對的總數P。並將P對1000000007取模的結果輸出。

 /*        最簡單的思路:陣列的所有數兩兩比較,進行累加,空間複雜度為O(n^2)  */ class Solution { public: int InversePairs(vector<int> data) { int P

php 個數中的兩數字數字之和等於一個給定的值

有關於php的有好幾種思路,很多部落格都有我就不一一介紹了,只是貼程式碼僅供參考。 問題:給一個一維陣列,不確定具體有多少元素,例如$arr = [1,2,3,4,3,2,1],讓他們任意兩數字相加的和等於一個給定的值,比如說 5 ,可能有好幾個兩個數相加都是5,但只是取最

程式設計師面試題:快速個數中的兩數字數字之和等於一個給定的值

能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個陣列中肯定存在至少一組符合要求的解。 假如有如下的兩個陣列,如圖所示: 5,6,1,4,7,9,8 給定Sum= 10 1,5,6,7,8,9 給定Sum=

陣列中的兩數字如果前面一個數字大於後面的數字數字組成一個逆對。輸入個數,求這個陣列中的逆對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%100000000

分析:可以利用兩層for迴圈,從頭開始遍歷查詢每一個元素的逆序對數,然後求總和。也可以利用歸併排序的思想來求解。下面是利用歸併排序的思想求解 public class Solution{public int InversePairs(int[] array) {if (ar

個數中兩個數為N數字的下標

完整 進行 代碼 ray 由於 比較 返回 put else 分析,兩個數字的和為N。那麽這兩個數字是否是唯一的呢?輸出的下標是否是第一對出現的呢? 1,我們假設這兩個數字是唯一的 和是唯一的,那麽其中一個數字越大,另一個數字就越小。想到大小關系,我們就想到了排序。那麽首先

給定一個只包含正整數的非空陣列,返回該陣列中重複次數最多的前N數字 ,返回的結果重複次數多到少降排列(N不存在取值非法的情況)

1 """ 2 #給定一個只包含正整數的非空陣列,返回該陣列中重複次數最多的前N個數字 3 #返回的結果按重複次數從多到少降序排列(N不存在取值非法的情況) 4 解題思路: 5 1.設定一個空字典,去儲存列表中的值和值出現的次數 6 2.使用L.count()方法可以統計出L中值出現的次數

個數中只有兩數字是出現 其他所有數字都出現了兩次數字

題目:一個數組中只有兩個數字是出現一次, 其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 參考程式碼: #include<stdio.h> #include <windows.h> void find_num(int arr[], int len

個數中只有兩數字是出現其他所有數字都出現了兩次。 數字程式設計實現。

1.一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 #include<stdio.h> #include<stdio.h> int main() { int arr[] = { 1, 3, 8, 1,

段讀取檔案排列的lua指令碼

local method = ngx.var.request_method; local headers = ngx.req.get_headers(); local uri_args = ngx.r

【C語言】個數中只有兩數字是出現其他所有數字都出現了兩次。 數字程式設計實現。

一看到這道題,我想到了之前學習過的異或。我們知道兩個相同的數字異或的結果是 0,因為在計算機中,異或運算是按照二進位制位來運算的,相同為 0 ,相異為  1。任何數與 0 異或都等於它自己。既然我們要找出來一組數中不同的兩個數字,也可以採用這種方法。 但是這次不是直接異或,

個數中只有兩數字是出現其他所有數字都出現了兩次。數字

方法1:遍歷,查詢 定義一個臨時變數k=0,不斷將陣列每個數與陣列每個元素比較,如果兩個數相等k++,然後判斷k是否等於1。如果為1,則這個數在陣列只出現一次;如果k=2,說明出現兩次。 #define _CRT_SECURE_NO_WARNINGS 1

個數中只有兩數字是出現次的其他的數字都出現了兩次數字編寫程式。

本題的最關鍵之處就是巧用兩個數異或得到的二進位制中“1”單位位數程式碼如下:方法一:#include<stdio.h> int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3, 4, 5, 6 }; int i = 0;

個數中只有兩數字是出現其他所有數字都出現了兩次。數字程式設計實現。

#include<stdio.h> Find_Num(int arr[], int sz , int * num1, int *num2) { * num1 = 0; * num2 = 0; int i = 0;

【C語言】個數中只有兩數字是出現其他所有數字都出現了兩次。 數字

要求:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。程式設計實現。 程式碼如下 int find(int arr[],int len) { int i,j,count; for(i = 0;i

個數中只有兩數字是出現其他所有數字都出現了兩次。 數字程式設計實現。

思路: 1.我們都知道如果兩個相同的數進行異或會相互抵消結果為0,所以我們先將數組裡的所有數進行異或,得到的結果是陣列中兩個只出現一次的不同的數的異或結果(記為ret) 2.ret的二進位制數中,是

個數中只有兩數字是出現其他所有數字都出現了兩次數字

【問題描述】:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。找出這兩個數字,程式設計實現。 【解決思路】:一組數中如果有1個不重複出現的數字,其他數字都重複出現2次,那麼將所有的值異或在一起就是這個不重複的數字。例如:{1,1,2,2,3,3,4},所