演算法 動態規劃 多重揹包 二進位制優化

2021-07-06 09:02:44 字數 1047 閱讀 6900

/*

name:多重揹包 二進位制優化 (dp)

actor:ht

time:2023年11月2日

error reporte:

*/#include #include #include #include #include #include #include #include #include #define n 10010

using namespace std;

int dp[100];

int value[n];

int cost[n];

int size[n]; //數量

int n, m; //n個寶石 m大小揹包

int main()

for (i = 0; i < m; i++)

for (i = 0; i < n; i++)

}else //不夠多,那就二進位制拆成01揹包吧

div2 -= div1;

div1 *= 2;

}for (j = m; j >= div2*cost[i]; j--) //剩餘的量再補一次

}} printf("%d\n", dp[m]);

} return 0;

}//dp[j] = (隱含:看了i個寶石,)揹包剩餘空間j

//dp[j] = max

//後記:二進位制思想

//假設有1000個蘋果,現在要取n個蘋果,如何取?

//正常的做法應該是將蘋果乙個乙個拿出來,直到n個蘋果被取出來。

//又假設有1000個蘋果和10只箱子,如何快速的取出n個蘋果呢?

//可以在每個箱子中放 2^i (i<=0<=n)個蘋果,也就是 1、2、4、8、16、32、64、128、256、489(最後的餘數)

//相當於把十進位制的數用二進位制來表示,取任意n個蘋果時,只要推出幾隻箱子就可以了。

//二進位制優化的思路,就是將m個相同物品,堆分成1、2、4、8、...這「幾個」大小不等的物品

//通過對這幾個堆的取捨,來完成達到拿走n個物品的的最優情況

動態規劃 二進位制揹包 多重揹包

之前有過一篇多重揹包判斷是否能湊乙個整數的問題 傳送門 如果我們不是判斷是否能湊成這個數,而是計算這個數內的揹包最大值,就不能用這個寫法了 也可能是我太菜了,一直wa 於是就有了二進位制揹包的方式 在多重揹包中如果每個揹包被選擇的次數maxi都比較小 我們可以把他拆違maxi個相同的揹包 但如果ma...

多重揹包二進位制優化

多重揹包二進位制優化 將價值數量相同的物品分成1,2,4,8.因為100以內任何數都可以由幾個2的n次方數組成。所以,有遍歷沒乙個數變為遍歷每乙個2的n次方數。例題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相...

多重揹包(二進位制優化)

馬上就要輕院校賽了,沒時間了,下面是網上找的多重揹包,感覺很好 void zeroonepack int cost,int weight,int n void completepack int cost,int weight,int n void multipack int c,int w,int ...