01揹包問題

2022-03-17 22:02:53 字數 2136 閱讀 1758

1,從樸素的方法開始。。

2,第0第1,,嗯看你定義嘍。。

#includeusing

namespace

std;

const

int manx=1005

;int n,wei,w[1005],v[1005

];int rec(int i,int

j)

else

if(jelse

return

res;

} int

main()

cin>>wei;

cout

<0

,wei);

}

3,樸素的有點像遞迴裡面的選數。就是多了點邊界條件。

if else啥的。。得拓展一下。

if(i==n)

else if(j1

,j);

}else

應該是第三個以後的選擇只能用else了。應該是規範。

4,費大的話,我看題目覺得呢,有點像附加限制條件的貪心。**呢,像有邊界的選數。(核心就是啊,除了乙個i==n和j就是乙個選數,選和不選。然後用了遞迴的形式。和這個三個選擇只能選其一的東西。

費小的話,i==n裡面的條件我都改過了。

遞迴最後一定要返回個東西。不過好像也沒啥可改的了。

5,至於加上記憶化的,我還是覺得我記憶化不好。

還好我記憶化弄對了/

#include#include

using

namespace

std;

int n,wei,w[1005],v[1005

];int memo[1005][1005

];int rec(int i,int

j)

if(i==n)

else

if(j1

,j);

} else

return

memo[i][j];

} int

main()

cin>>wei;

cout

<0

,wei);

}

還是比較清晰的嘿嘿。

不過我還是要分析,不,好好分析一下,我的記憶化。。

先分析時間複雜度,第乙個跟選數那樣的肯定是2^n了(最壞情況下)

記憶化下的分析度是nw??w??實在沒有很懂。

我要好好搞一下記憶化

總而言之,記憶化搜尋和動態規劃關係很大很大!

6,至於它這個專欄上的窮竭搜尋。不就是搜尋上加了個sum的狀態麼。。。

其他基本沒變。。

7,真dp讓我額。。。

#includeusing

namespace

std;

const

int maxn=1005

;int

dp[maxn][maxn];

intn,wei,w[maxn],v[maxn];

intmain()

cin>>wei;

for(int i=n-1;i>=0;i--)

else

} }

cout

<0][wei]<}

呃呃呃呃呃呃

我們來費大(感覺你之前有些浪費時間。。不過這也是為了你好理解好把》)

費大需要用費小的模擬樣例來支援。o'p'j

額,為啥從第i個物品開始挑選,總重小於j,的總價值的最大值為何

要從第i+1個算??

第三遍才完全推出來,所以你的,,結果是什麼。。

我懂這個從第i個物品開始挑選是啥意思了。所以說你的**跟你自己的狀態設定關係很大。

8,上面的逆向。

定義,dp[i+1][j]為從0到i+1個物品中選出總重量不超過j的物品時總價值的最大值。

遞推關係式。

我........咋感覺還要推還要那啥呢。。。我突然想到了賦值的一些東西。

我突然覺得我這個掌握挺差的。。。一弄個這我就。。。。fo了。。。

9,模擬樣例的時候你不能。。光寫啊。。偷懶啊。。要動腦子的。

dp第乙個還行,第二個就有點混亂了。

還是弄個現實的場景好想,

乙個撿鑽石。

未完待續。。。

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...