1,從樸素的方法開始。。
2,第0第1,,嗯看你定義嘍。。
#includeusingnamespace
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#includeusing
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讓我額。。。
#includeusingnamespace
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...