日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三种基本背包问题

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三种基本背包问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、0/1背包問題

問題描述:有n件物品和容量為m的背包 給出i件物品的重量以及價值 求解讓裝入背包的物品重量不超過背包容量 且價值最大 。
特點:這是最簡單的背包問題,特點是每個物品只有一件供你選擇放還是不放。
① 二維解法
設f[i][j]表示前 i 件物品 總重量不超過 j 的最大價值 可得出狀態轉移方程
f[i][j]=max{f[i-1][j-a[i]]+b[i], f[i-1][j]}

代碼: for(int i=1;i<=n;i++)for(int j=m;j>0;j--){if(a[i]<=j)f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+b[i]);else f[i][j]=f[i-1][j];}

在一些情況下 題目的數據會很大 因此f數組不開到一定程度是沒有辦法ac。

②一維解法
設f[j]表示重量不超過j公斤的最大價值 可得出狀態轉移方程
f[j]=max{f[j], f[j?a[i]]+b[i]}

代碼:for(int i=1;i<=n;i++){ for(int j=m;j>=a[i];j--)f[j]=max(f[j], f[j-a[i]]+b[i]); }

二、完全背包問題

問題描述:有n件物品和容量為m的背包 給出i件物品的重量以及價值 求解讓裝入背包的物品重量不超過背包容量 且價值最大 。
特點:題干看似與01一樣 但它的特點是每個物品可以無限選用

設f[j]表示重量不超過j公斤的最大價值 可得出狀態轉移方程
f[j] = maxj{f[j], f[j?a[i]]+b[i]}

代碼: for(int i=1;i<=n;i++)for(int j = a[i];j <= m;j++){f[j] = max(f[j], f[j-a[i]]+b[i]);}

三、多重背包問題

問題描述:有n件物品和容量為m的背包 給出i件物品的重量以及價值 還有數量 求解讓裝入背包的物品重量不超過背包容量 且價值最大 。
特點 :它與完全背包有類似點 特點是每個物品都有了一定的數量

狀態轉移方程為:
f[j] = max{f[j], f[j?k?a[i]]+k?b[i]}

for(int i=1;i<=n;i++)for(int j=m;j>=a[i];j--)for(int k=0;k<=c[i];k++){if(j-k*a[i]<0)break;f[j] = max(f[j], f[j-k*a[i]]+k*b[i]);}

實戰:

題目一:322. 零錢兌換

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。 你可以認為每種硬幣的數量是無限的。

總結

以上是生活随笔為你收集整理的三种基本背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。