題目有n件物品和乙個容量為v的揹包。第i件物品的重量是w[i]。求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量的最大重量。
首先,我想分析一下這個題目大暴力時,複雜度為什麼為n^2。如果大暴力,本題目的預算次數實際為pow(2,n)-1。
初等數學思路(大佬請忽略):
本題中一共給定n個物品,如果要放入1個物品時為n種;
如果要放入2個時候,需要從n個中取出a2n個物品;
所以該題目為n個物品從1到n的全排列的前n項和;
(ps:如果任意乙個物品體積都大於揹包體積時,所以存在所有物品都不選擇的坑)
所以由初等數學知識可知,該題目的實際運算次數為pow(2,n)-1;
二進位制思路:先上思路圖
首先需要先解釋一下,**中的紅色表示選擇a[i-1]位置的物品,綠色則表示不選擇。
再進行思路解釋,物品中共有pow(2,n)-1個線段。每個線段回溯到頂端,就為一種方法解決方法,如果把要與不要,分別抽象為1和0,則實現了控制是否收取本位物品的方法,在進行判斷每次加法之後是否存在乙個大數,記錄大數就可以,當不滿足是跳過就可以。
(ps:當出現問題拓展的時候,可以記錄滿足條件時候的十位數就可以了)。
//
// main.cpp
// 01揹包問題(二進位制)
// created by malker on 2017/3/2.
//#include #include #include using namespace std;
int main(int argc, const char * argv)
if(sum <= biger)
max1 = max(max1,sum);/*篩選判斷*/
else
continue;/*最水的優化*/
}sum=0;/*初始化相應位置的求和*/
}printf("%d\n",max1);
}return 0;
}//if((i>>1)&1)
01揹包 二進位制拆分
二進位制拆分原理 任何乙個整數都可以轉換成乙個若干個2k 2 k數相加的形式 因為可以轉化成二進位制數 k個物品,我們可以選擇的是取 0 e 件,代價和大小分別是取的件數 p,p ti 和 p ci。假設我們取 p 件得到的就是最優解,當我們把 e 件物品變成若干件,其中2k 2 k k且2k 12...
混合揹包問題(01 完全 多重揹包二進位制優化)
題意 給n件物品和乙個容積為v的揹包,有些物品只可以拿一次,有些物品可以無限拿,有些物品可拿規定的次數,問你在揹包容量內,可獲得最大的價值是多少。思路 把不同的物品種類分開處理即可。注意多重揹包應該使用二進位制優化與01揹包視為同類處理,否則tle include using namespace s...
多重揹包(二進位制模板 普通解法)
題目 1 include 2 include 3 include 4 include 5 6using namespace std 7const int max 100 10 8 intv 9int f max price max weight max amount max 10void oneze...