演算法筆記 從N個整數中選取K個數的最優方案

2021-10-23 04:30:57 字數 1690 閱讀 3683

給定n個整數(可能有負數),從中選擇k個數,使得這k個數之和恰好等於乙個給定的整數x;如果有多種方案,選擇它們中元素平方和最大的乙個。資料保證這樣的方案唯一。例如,從4個整數(2,3,3,4}中選擇2個數,使它們的和為6,顯然有兩種方案與,其中平方和最大的方案為。

解題思路:

使用深度搜尋遍歷來實現,每次有兩種選擇:

將當前數字放入已選序列

不講當前數字放入已選序列

需要注意的是,若將當前數字放入已選序列,則當要執行不放入序列的時候,需要將當前數字去掉

#include

using

namespace std;

#include

const

int max_n =30;

//序列a中選取 k 個數使和等於 x ,最大的平方和為max_sum_squ

int dfsn, k, x, max_sum_squ =-1

;int a[max_n]

;//序列

//temp 存放臨時方案,result 存放最終方案

vector<

int> temp, result;

//************************************

// method: dfs

// fullname: dfs

// access: public

// returns: void

// qualifier:

// parameter: int index 當前選取的序列號

// parameter: int now_k 當前已選取數字的個數

// parameter: int sum 當前已選取數字的和

// parameter: int sum_squ 當前已選取數字的平方和

//************************************

void

dfs(

int index,

int now_k,

int sum,

int sum_squ)

return;}

if(index == dfsn || now_k > k || sum > x)

//選取 index 號數字

temp.

push_back

(a[index]);

dfs(index +

1, now_k +

1, sum + a[index]

, sum_squ + a[index]

* a[index]);

temp.

pop_back()

;//不選 index 號數字

dfs(index +

1, now_k, sum, sum_squ);}

intmain()

dfs(0,

0,0,

0); cout << max_sum_squ << endl;

for(vector<

int>

::iterator it = result.

begin()

;it != result.

end(

);it++

)system

("pause");

return0;

}

從n個數中選擇k個數

這是組合問題,組合問題有幾種寫法,且時間複雜度位o n 2 1 暴力迴圈,適用於固定的k 比方從7個數中找兩個數 int main sort nums.begin nums.end int count 0 for int i 0 i nums.size i cout count 2 當前數選不選,遞...

等概率無重複的從n個數中選取m個數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!問題描述 程式的輸入包含兩個整數m和n,其中m學習過概率統計的同學應該都知道每乙個數字被抽取的概率都應該為m n.那麼我們怎麼構造出這樣的概率呢?在 程式設計珠璣 上面是這樣解析的 依次考慮整數0,1,2,n 1,並通過乙個適當的隨機測試對每個整數...

從給定的N個正數中選取若干個數之和最接近M

這道題跟撈魚問題一樣,都是剛進實驗室新生培訓那會兒做過的題目,不過這個是一師姐當時找工作的面試題。如題,並輸出該子串行 測試用例 2,9,5,7,4,11,10 分別輸出最接近33 40 47 60的子串行 分析 n個數之和接近m,將m看做乙個容量的揹包,這個題目就變成了典型的01揹包,m容量下求最...