C 典型題 面試演算法 動態規劃相關

2021-08-21 08:49:19 字數 3796 閱讀 9286

基礎演算法學習總結,後續會不斷增加。

編譯時請使用–std=c++11選擇項,如:vector陣列使用了c++11的初始化列表特性。

容量為12的揹包,有6種物品,每種物品只有乙個,其重量分別為4, 6, 2, 2, 5, 1,其價值分別為8, 10, 6, 3, 7, 2。

設計演算法,實現揹包內物品價值最大。

#include 

#include

int max(int left, int right)

int zeroonebag(const

std::vector

& wights, const

std::vector

& values, int bagspace)

std::vector

> totalvalue;

totalvalue.resize(2);

for (int i = 0; i < totalvalue.size(); ++i)

for (int i = 1; i < wights.size(); ++i)

}return totalvalue[(wights.size() - 1) % 2][bagspace];

}int main() ;

std::vector

wights = ;

int bagspace = 12;

std::cout

<< zeroonebag(wights, values, bagspace) << std::endl;

}

容量為10的揹包,有5種物品,每種物品數量無限,其重量分別為5,4,3,2,1,其價值分別為1,2,3,4,5。

設計演算法,實現揹包內物品價值最大。

#include 

#include

int max(int left, int right)

int completebag(const

std::vector

& wights, const

std::vector

& values, int bagspace)

// 如果暫時不考慮k的話可以簡化為:

// totalvalue[i][bagspace] = max

// 和01揹包不同的是,完全揹包在裝物品i時只使用了物品i-1時的乙個狀態,同理裝物品i+1時也會只使用物品i的乙個狀態,

// 因此上面的二維方程可以轉化為下面的一維方程。

// totalvalue[bagspace] = max

std::vector

totalvalue;

totalvalue.resize(bagspace + 1, 0);

for (int i = 1; i < wights.size(); ++i)

}

return totalvalue[bagspace];

}int completebagplus(const

std::vector

& wights, const

std::vector

& values, int bagspace)

int main() ;

std::vector

wights = ;

int bagspace = 10;

std::cout

<< completebag(wights, values, bagspace) << std::endl;

}

學校聯歡晚會的時候,為了使每乙個同學都能參與進來,主持人常常會帶著同學們玩擊鼓傳花的遊戲。遊戲規則是這樣的:n個同學坐著圍成乙個圓圈,指定乙個同學手裡拿著一束花,主持人在旁邊背對著大家開始擊鼓,鼓聲開始之後拿著花的同學開始傳花,每個同學都可以把花傳給自己左右的兩個同學中的乙個(左右任意),當主持人停止擊鼓時,傳花停止,此時,正拿著花沒傳出去的那個同學就要給大家表演乙個節目。

聰明的小賽提出乙個有趣的問題:有多少種不同的方法可以使得從小賽手裡開始傳的花,傳了m次以後,又回到小賽手裡。對於傳遞的方法當且僅當這兩種方法中,接到花的同學按接球順序組成的序列是不同的,才視作兩種傳花的方法不同。比如有3個同學1號、2號、3號,並假設小賽為1號,花傳了3次回到小賽手裡的方式有1->2->3->1和1->3->2->1,共2種。

輸入:輸入共一行,有兩個用空格隔開的整數n,m(3<=n<=30,1<=m<=30)

樣例輸入:3 3

輸出:輸出共一行,有乙個整數,表示符合題意的方法數

樣例輸出:2

#include 

#include

using

namespace

std;

int main()

// 同學編號從1-n

// result[m][n] 經過m步從第n個同學到達第乙個同學

result[1][1] = 0;

result[1][n] = 1;

result[0][1] = 1;

// 第j個同學通過i步到第1個同學 = 第j+1(右邊同學)通過i-1步到達第乙個同學方式數 + 第j-1(左邊同學)通過i-1步到達第乙個同學方式數

for (int i = 1; i <= m; ++i)

}for (int i = 0; i < result.size(); ++i)

std::cout

<< std::endl;

}// 輸出第乙個同學經過m步,又把花傳到自己手裡面

cout

<< result[m][1] << endl;

}

for example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).

提供兩種方法,一種是遞迴,另外一種是動態規劃

#include 

#include

using namespace std;

int searchmaxnum(int

length, int lastidx, int idx)

if (idx > length)

if (idx == length)

return idx - lastidx;

}// 截出的繩段長為idx

int left = (idx - lastidx) * searchmaxnum(length, idx, idx + 1);

// 截出繩段長為idx+1

int right = searchmaxnum(length, lastidx, idx + 1);

return

max(left, right);

}int cutrope(int

length)

return searchmaxnum(length, 0, 1);

}int dpcutrope(int

length)

std::vector dp;

dp.resize(length + 1, 1);

dp[1] = 0;

dp[0] = 0;

for (int i = 2; i <= length; ++i)

}return dp[length];

}int main ()

面試演算法題

前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...

面試演算法題

1 直方圖矩形最大值 class solution s.push i return res 2 第n個醜數 class solution return res.back 3 lru cache 最近最少使用頁面置換快取器 class lrucache int get int key void set...

面試演算法題 動態規劃和貪心演算法的區別

首先動態規劃和貪心都是用來解決問題的,我們用q n 來表示所要解決的總規模為n的問題的集合,我們的最終結果就是要選出乙個子集a n 對於動態規劃來說,要解決q n 首先要解決a 1 a 2 a n 1 a n 此時是在的某個子集的基礎上得到的。而對於貪心來說,我們能夠從這個待解決的問題上得到一種更緊...