訓練營第七天 實戰DP

2021-09-10 12:36:51 字數 1926 閱讀 3754

揹包問題描述:有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,每件物品數量只有乙個,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

動態規劃的基本思路:將該問題轉換成子問題,考慮五件物品在給定承重 c 的揹包下最大價值為原問題,如下表所示,即為考慮abcde,c = 10時的最大價值,假設為f[5][10],原問題的解可以分解為兩種情況,第一種情況是不考慮放入a只考慮放入bcde承重為c時的最大價值f[4][c],第二種情況是考慮放入a時的最大價值,即value[a]+f[4][10-weight[a]]。 原問題的解f[5][10]取上述兩種情況中的最大值,即f[5][10] = max。 由此可以看出裡面涉及到需要計算f[4][10]和f[4][10-weight[a]]即f[4][4]等子問題。 以此類推,自頂向下的分析可以看出原問題需要子問題的解,我們需要先計算出子問題的解,自底向上求解。求解方式如下表所示,順序是自底向上、從左往右,或者從左往右、自底向上都可以。注意此問題中的abcde可以包含相同的物件,它們之間的順序也可以是任意的,不影響最終的結果。

#include using namespace std;

int knapsack(int *w, int *v, int *res, int n, int c)

for(int i = 0; i < n; i++)

for(int j = 0; j <= c;j++)

f[i][j] = 0;

for(int i = 0; i < n; i++)

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

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

else }}

for(int i = 0; i < n; i++)

value = f[n-1][c];

int j = n-1;

int y = c;

while(j)

j--;

}if(f[0][y])

for(int i = 0; i < n;i++)

delete f;

f = 0;

return value;

}void test1()

int w = 0, v = 0, i = 0;

while(i < n)

int value = knapsack(w, v, res, n, c);

cout << value << endl;

for(int i = 0; i < n; i++)

cout << res[i] << " ";

cout << endl;

delete w;

delete v;

delete res;

}}int main()

**:

class solution(object):

def mincut(self, s):

""":type s: str

:rtype: int

"""if not s:

return 0

s_len = len(s)

mem = [i for i in range(-1, s_len)]

for i in range(1, s_len+1):

for j in range(i):

if s[j:i] == s[j:i][::-1]:

mem[i] = min(mem[i], mem[j] + 1)

return mem[-1]

執行結果:

實習第七天

昨天經理說今天會刮颱風,所以我們要求停課比較好,畢竟我是乙個非常熱愛生命的人,這絕對不是因為我小時候差點被颱風刮走,真的不是因為這個!可是今天一大早,天氣很涼快,可是再如何涼快,還是沒有暴風雨即將來臨的感覺,為此我們捶胸頓足,為什麼停課,停課也不得不去,因為我們還得以實習生的身份過去,說起這ppt,...

第七天筆記

理解 陣列的基本概念 理解 陣列的分類 陣列的幾個名詞 陣列的應用場景 按維度分類 掌握 定義陣列 掌握 初始化陣列 掌握 陣列的使用 指定陣列的元素個數,對陣列進行部分顯式初始化 不指定元素個數,定義的同時初始化,它是根據大括號中的元素的個數來確定陣列的元素 個數 int nums 指定元素個數,...

工作第七天

dns是一種阻止層域層次結構的計算機和網路服務命名系統,它用於tcp ip網路,他從事將主機名或網域名稱轉換為實際ip位址的工作 dns domain name system 負責解析url uniform resource locator 其中有遞迴查詢 詢問人改變,詢問內容不變,詢問物件沒有 和...