1. 程式人生 > 其它 >經典01揹包問題(一維陣列優化法)

經典01揹包問題(一維陣列優化法)

01揹包問題

有 N 件物品和一個容量是 V 的揹包。每件物品只能使用一次。

第 i 件物品的體積是 vi,價值是 wi。

求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。

輸入格式
第一行兩個整數,N,V,用空格隔開,分別表示物品數量和揹包容積。

接下來有 N 行,每行兩個整數 vi,wi,用空格隔開,分別表示第 i 件物品的體積和價值。

輸出格式
輸出一個整數,表示最大價值。

資料範圍
0<N,V≤1000
0<vi,wi≤1000
輸入樣例
4 5
1 2
2 4
3 4
4 5
輸出樣例:
8

#include<stdio.h>
#include
<math.h>
#include<algorithm> using namespace std; int main() { int n,v,a[1010],b[1010],i,j,k,s,d[1010]; scanf("%d%d",&n,&v); for(i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); for(i=0;i<=v;i++)//初始化陣列 d[i]=0; for(i=1;i<=n;i++) for(j=v;j>=
a[i];j--) { d[j]=max(d[j],d[j-a[i]]+b[i]);//不選當前物品和選當前物品的最大值 } printf("%d\n",d[v]); }

在這裡插入圖片描述
樣例資料
當i=1時,j從最大開始j=5到j=1都可以裝下第一個i,所有價值就是2
當i=2時,j=5開始,因為當想要第二個物品就要為他騰出空間,所以d[j]=max(d[j],d[j-a[i]]+b[i]);這個時候d[5]=d[5-a[2]]+b[2]=6,當j=2時我們發現選擇第二種物品比第一種物品的價值更大,所以我們會選擇第二種物品,j=1時,選擇第一種。
當i=3時,j=5開始,這時候想要第三件物品就要為第三件物品騰出空間也是5-3=2,這個2就代表你只有2的空間去選擇前兩件物品,我們發現當空間為2時,價值最大為4,所以這時候d[5]=8,同理可求出4,3,2,1。

一直計算出所以i選或者不選的情況.
當我們想要這件物品就需要為這件物品騰出空間,也就是j-a[i]再加上它的價值b[i]與它不選擇這件物品的d[j]比較選出最大值.

後面會更新二維陣列做法,一維陣列比較方便!!!,二維陣列容易炸!!!所以會一維陣列最好,但二維陣列更容易理解.