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 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...