基礎揹包問題(01,完全,多重)

2021-07-09 09:37:45 字數 2593 閱讀 7115

01揹包:

有n 種不同的物品,每一種物品一件,每個物品有兩個屬性,

wei重量(體積),val 價值,現在給乙個容量為 v 的揹包,問

最多可帶走多少價值的物品。

完全揹包:

在01揹包的基礎上,如果物品不計件數,就是每個物品無限件的話,求出結果。

多重揹包:

在01揹包的基礎上,每一件物品的件數是一定的(給出的),求出結果。

01揹包:

狀態轉移方程(預設求最大價值):dp[j]=dp[j-wei[i]]+val[i]>dp[j]?dp[j-wei[i]]+val[i]

:dp[j]

for (int i=0; i=wei[i]; j--)

}

完全揹包:

為了累加效果,所以從前向後遍歷:

for (int i=0; it?dp[j]:t;

}}

多重揹包:

把每一中物品的個數用二進位制原理展開,轉成01揹包處理:

多重揹包的二進位制轉化原理:

把乙個數字展開成二進位制,我們可以發現乙個數字可以由小於他的1,10,10,1……組成。有乙個誤區,例子:10轉化成二進位制後:1010,設c=10, 如果直接用for(int i=1; i<=c; i<<=1) 列舉我們將得到1, 10, 100, 1000 這幾個二進位制數,存在結果大於10的組合(如1111)。想要將多重揹包轉化成01揹包,就必須保證得到的數字的任意組合小於等於10。所以列舉時有這樣的改進: f

or(int i=1;i<=c;i<<=1)

if(c>0)

得到的數字是1,10,100,11。前三個數字的組合結果包含了0——7,最後乙個數字是3,那麼結果就是0——10。剛好滿足條件。

另外,如果dp的初始化是0,那麼得出結果是v可以不用完的,也能是用完的。當初始化為負無窮小 -inf,dp[0]=0時,結果是v剛好用完的。(看看**就能明白)

hdu 1114 

piggy-bank(多重揹包取最小)

#include #include #include using namespace std;

typedef long long ll;

ll n,v,wei[505],val[505],dp[10005];

ll work()

return 0;

}

hdu 2191 

悼念512汶川大**遇難同胞——珍惜現在,感恩生活(簡單多重揹包)

#include #include #include using namespace std;

int wei[505],val[505],dp[105];

int n,v;

int main()

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

int ans=0;

for(int i=0;i=wei[i];j--)

}printf("%d\n",ans);

}return 0;

}

hdu 1171 

big event in hdu (wei=val 多重揹包)

#include #include #include using namespace std;

const int n=3e5+10;

int wei[400],dp[n],cnt;

int main()

int v2=v/2;

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

for(int i=0;i=wei[i];j--)

}int ans2=dp[v2],ans1=v-ans2;

printf("%d %d\n",ans1,ans2);

}return 0;

}

hdu 1864

最大報銷額(wei=val浮點01揹包)

#include #include #include using namespace std;

const int n=3e6+10;

int wei[n],dp[n];

bool check(char ch)

int main()

}printf("%.2lf\n",dp[qq]/100.0);

}return 0;

}

hdu 4508 

湫湫系列故事——**記i  (簡單完全揹包)

#include #include #include using namespace std;

typedef long long ll;

const ll n=105,m=1e5+10;

ll n,v;

ll wei[n],val[n],dp[m];

ll work()

}return dp[v];

}int main()

{ //freopen("cin.txt","r",stdin);

while(cin>>n){

for(int i=0;i

揹包問題 01 完全 多重

題目 n件物品,容量為v的揹包,第i件的體積為c i 價值為w i 特點 每種物品只有一件,可以選或者不選 for i 1.n for v v.0 f v max tip 初始化的細節問題 在求最優解的揹包問題中,一般有兩種不同的問法 1 要求 恰好裝滿揹包 時的最優解 2 求小於等於揹包容量的最優...

多維多重揹包問題 01揹包,完全揹包,多重揹包

csdn 專業it技術社群 登入 blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。1.1空間優化 這要求在每次主迴圈中我們以 v v 0 的遞減順序計算 f v 這樣才能保證計算 f v 時 f v ci 儲存的...

01揹包問題 完全揹包問題 多重揹包問題

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...