基礎演算法學習總結,後續會不斷增加。容量為12的揹包,有6種物品,每種物品只有乙個,其重量分別為4, 6, 2, 2, 5, 1,其價值分別為8, 10, 6, 3, 7, 2。編譯時請使用–std=c++11選擇項,如:vector陣列使用了c++11的初始化列表特性。
設計演算法,實現揹包內物品價值最大。
#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 此時是在的某個子集的基礎上得到的。而對於貪心來說,我們能夠從這個待解決的問題上得到一種更緊...