C++|算法(32)-贪心(2)-切金条问题-C++

问题:
一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,
都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,
整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长 度60的金条分成10和50,
花费60 再把长度50的金条分成20和30, 花费50 一共花费110铜板。 但是如果, 先把长度60的金条分成30
和30,花费60 再把长度30 金条分成10和20,花费30 一共花费90铜板。 输入一个数组,返回分割的最小代价。
思路:哈夫曼编码 ,小根堆
C++代码

/* 贪心2 分金条 小根堆 */ #include #include #include #include "SF.h" using namespace std; class MinheapComparator { public: bool operator ()(const int n1, const int n2)const { return n1, greater> pQ; //小根堆 for (int i = 0; i < m_num; i++) { pQ.push(arr[i]); // 1.所有数字扔到小根堆里去 } int sum = 0; int cur = 0; while (pQ.size() > 1) {//4.周而复始,当小根堆只剩一个数 这就是代价之一 int temp1 = pQ.top(); pQ.pop(); int temp2 = pQ.top(); pQ.pop(); cur = temp1 + temp2; //2.弹两个合一个数sum += cur; pQ.push(cur); //3.把这个数扔到小根堆里去 } return sum; } void lessMoneySplitGold_test() { int arr[] = { 6, 7, 8, 9 }; cout<< lessMoney(arr,4) <, greater> minQ1; for (int i = 0; i < arrForHeap_len; i++) { minQ1.push(arrForHeap[i]); } while (!minQ1.empty()) { cout << minQ1.top() << " " << endl; minQ1.pop(); } // min heap use Comparator cout << "*******min heap use Comparator ********" << endl; priority_queue, MinheapComparator> minQ2; for (int i = 0; i < arrForHeap_len; i++) { minQ2.push(arrForHeap[i]); } while (!minQ2.empty()) { cout << minQ2.top() << " " << endl; 弹出 minQ2.pop(); //删除 } cout << "*******max heap use Comparator ********" << endl; // max heap use Comparator priority_queue, MaxheapComparator> maxQ; for (int i = 0; i < arrForHeap_len; i++) { maxQ.push(arrForHeap[i]); } while (!maxQ.empty()) { cout << maxQ.top() << " " << endl; maxQ.pop(); }} void lessMoneySplitGold_main() { cout<<"***************lessMoneySplitGold_main******************"<

【C++|算法(32)-贪心(2)-切金条问题-C++】


    推荐阅读