這道題很有意思,n,c的資料量達到10000,如果用普通的01揹包來做絕對會超時,注意到v和c只有0~10的範圍,這說明有大量的v,c是重複的,相同的v,c的單詞是等價的,這樣就可以轉化為多重揹包來做。
不過普通的多重揹包又可能會超時,於是我們採取二進位制優化的方式來優化成01揹包問題。
從01揹包到多重揹包又到01揹包,的確是道好題。。
#include
using
namespace std;
char in[20]
;const
int n =
100000+10
;int v[n]
,c[n]
,st[15]
[15],dp[n]
;int
main()
for(
int i =
0; i <=
10; i++
)//二進位制優化 不太熟
++cnt;
v[cnt]
= st[i]
[j]* i;
c[cnt]
= st[i]
[j]* j;}}
}for
(int i =
1; i <= cnt; i++)}
cout << dp[c]
<< endl;
}return0;
}
python多重揹包 多重揹包
多重揹包問題 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。資料範圍 0 n v 100 0 vi wi si 100 樸素版多重揹包問題 樸素版完全揹包問...
揹包學習 多重揹包揹包
有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...
揹包學習 多重揹包揹包
有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...