筆試中揹包問題的應用

2021-08-07 23:54:55 字數 1186 閱讀 3457

這是小菜鳥我自己的一點小總結,為了在面試中更加得心應手。後面遇到的相關問題不定期更新到這篇博文中,如果有什麼錯誤請各位大神不吝賜教,如果有什麼問題請各位多包涵。

講講01揹包的應用,01揹包的主要特點是每個物品只能選取乙個容量一定,要求選取的物品價值最大,揹包問題的變形很經典,思路是一樣的,列舉下目前遇到的相關揹包問題的經典變形。

1:無序陣列,能否將陣列分為兩部分,使兩部分的值相等

這是乙個很基礎的變形。巧妙應用了揹包中容量這一概念:

設陣列為a1,a2,a3,…..an。假設該陣列的和為s,把ai認為是容量,把最大容量設定為s/2,價值為ai,即所需容量即為價值。

memset(dp,0,sizeof(dp));

for(int i=0;ifor(int j=s/2;j>=a[i];j--)

}return dp[s/2]==s/2;

2:無序陣列,把陣列分為兩部分,使兩部分的差值最小。
這個題和上面幾乎是一模一樣,只需在最後求出dp[s/2]之後,s-2*dp[s/2]即可。

memset(dp,0,sizeof(dp));

for(int i=0;ifor(int j=s/2;j>=a[i];j--)

}return s-dp[s/2]*2;

3:無序陣列,能否找到其中和為num的子串行(不要求連續)
這個題就不是分為兩部分,而是任意部分均可,同樣的思路,只需滿足其中何為num即可,容量為num。

memset(dp,0,sizeof(dp));

for(int i=0;ifor(int j=num;j>=a[i];j--)

}return dp[num] == num;

dp與前一篇文章尺取的很明顯的區別就是,dp是不連續的,任何乙個位置都可以取到,而尺取是連續的,必須是一段連續的子區間。

0 1揹包和完全揹包問題應用

name 0 1揹包和完全揹包問題應用 author date 26 07 17 22 45 description 0 1揹包問題應用 數字組合問題 有m個正整數1 m,找出其中和為n的可能的組合方式。如 m 5,則5個數分別為1,2,3,4,5,n 5 那麼可能的組合有5 1 4和5 2 3和5...

完全揹包問題 列印揹包中的物品

與0 1揹包問題不同的是,每個物品可以任意次放,只要小於總容量就行,這裡列印裝進去的物品,還列印每種物品裝了多少次 如下 include include include using namespace std int main int argc,char argv vectorresult capa...

揹包問題 01揹包問題

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