狀態轉移方程(w[i]重量,v[i]值)
f[i][j] = max (j-w[i]>=0)
f[i][j] = f[i-1][j]; (j-wl[i]< 0)
description
乙個人在收集骨頭,他有乙個容積為
v 的揹包,不同的骨頭體積和價值都有可能不同,現在他想知道他用這個揹包最多可以帶走多少價值的骨頭。
input
輸入資料的第一行是乙個正整數,表示一共有幾組資料。
每組測試資料首先輸入兩個整數
n, v (n<=1000, v <=1000)
表示骨頭的個數,和揹包的容積,
接下來輸入兩行:
第一行有
n個整數表示每個骨頭的價值,•第二行有n 個整數表示每個骨頭的體積;
1.用二維陣列實現
時o(n*w),空o(n*w)
#include#include#include#includeusing namespace std;
const int n=1e3+5;
int n,w[n],v[n];
int dp[n][n],w;
int main()
printf("\n");
}printf("%d\n",m-f[m-5]-d[n]);//f[m-5]除最後一次的總消費
}}return 0;
}
狀態轉移方程(對比01揹包)
f[i][v]=max (k為每種物品數量)
hrbust - 1053 (模板題)
1.二維陣列解法
時間複雜度
o(v*σ(v/c[i]))
///此方式超出記憶體,但可以理解下
#include#include#include#includeusing namespace std;
const int n=1e3+5;
int f[n][n],w[n],v[n];
int g,u,t;
int main()
}printf("%d\n",f[g]);
}return 0;
}
3.多重揹包
狀態轉移方程
hdu - 2191 (模板題)
//好好理解前兩種,這個就能寫出
#include#include#include#includeusing namespace std;
const int n=1e3+5;
int c,n,m,p[n],h[n],c[n];
int f[n][n];
int main(){
scanf("%d",&c);
while(c--){
memset(p,0,sizeof(p));
memset(h,0,sizeof(h));
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=0;i歡迎指點,不喜勿噴
動態規劃之揹包問題
最近刷題遇到好幾道揹包問題,揹包問題是動態規則中的一類體型,在考察演算法的筆試中經常遇到。關於揹包問題,文章 揹包問題九講 中已經做了很多分析,這裡就不再細述,建議好好看看這篇文章。然而文章給了許多案例分析,卻沒有很好的練習。說明 1 本文目的不在於講解揹包問題的分析與講解,而是收集了一些揹包問題。...
動態規劃之揹包問題
一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...
動態規劃之 揹包問題
前些天在做動態規劃的題,感覺動態規劃博大精深,沒有一種特定的模式,學起來很費勁。在這裡就動態規劃中的揹包問題談談。三種揹包問題 0 1揹包,完全揹包,多重揹包。0 1揹包 有n件物品和容量為v的揹包,求解將哪些物品放入揹包中可以使獲得的價值最大。f i v 表示將前i件物品恰好放入容量為v的揹包可以...