POJ 1014 Dividing 母函式優化

2021-07-14 21:35:06 字數 1136 閱讀 6566

description

每一行輸入6個數,第i個數表示價值為i的珠寶的個數,問這些珠寶是不是能等價平分給兩個人。

sample input

1 0 1 2 0 0 

1 0 0 0 1 1 

0 0 0 0 0 0 

sample output

collection #1:

can't be divided.

collection #2:

can be divided.

思路

母函式模板題,先算出這些珠寶的總價值sum,利用母函式判斷sum/2的係數是否為0。如果不為0就能等價平分。

但僅僅套模板做會超時,因為珠寶總個數最大達到20000。因此需要剪枝。

網上題解提到只要輸入的數大於6,如果是大於6的奇數,那麼這個數用5代替結果是一樣的;如果是大於6的偶數,那麼這個數用6代替結果是一樣的.

這樣確實就過了,而且是0ms。

另外我發現,這種改寫不僅可以用6作分界線,任何大於6的數字也都行。只是6是能改寫的最小的分界線。

沒有明白其中的道理,留個解釋以後看。

#include #include #include #include typedef long long ll;

using namespace std;

const int n = 200;

int c1[n],c2[n],a[6];

int main()

sum+=(i+1)*a[i];

if(!a[i]) cnt++;

}if(cnt==6) break;

if(sum%2==1)

sum>>=1;

for(int i=1;i<=6;i++)

}for(int j=0;j<=sum;j++)

}printf("collection #%d:\n",cas++);

if(c1[sum]) printf("can be divided.\n\n");

else printf("can't be divided.\n\n");

}return 0;

}

部分揹包 poj1014 Dividing

一種物品,限制了數量,那就不能按照完全揹包的寫法去寫了 如果按照01揹包的方法去寫,如果數量很大,那麼必然會超時,那有沒有什麼好辦法呢?我們先講神奇的二進位制思想 我們都知道,任何乙個十進位制都能轉換成二進位制 廢話 那麼二進位制就會對應著許多二進位 還是廢話 每個二進位都是2的倍數 肯定啊 所以反...

POJ 1014 Dividing(深搜 剪枝)

考慮值為6的石頭 將值為6的石頭分為兩部分,一部分均分為兩堆,另一部分用於填補缺口。所謂填缺口就是當其他的石頭分完之後再把這部分石頭分入兩堆 也有可能只放入一堆 現在考慮需要多少6值石頭用於填缺口。假設左邊的總值小於右邊的總值 1.要能均分,剩下的缺口一定是6的倍數 2.在分配其他的石頭時,可以做到...

POJ 1014 Dividing 多重揹包問題

這題做了將近乙個月,斷斷續續的看揹包問題,今天總於一口氣把揹包九講中的前三講看完了。為什麼這樣正確呢?證明 1 數列1,2,4,2 k 1 n 2 k 1中所有元素的和為n,所以若干元素的和的範圍為 1,n 2 如果正整數t 2 k 1,則t一定能用1,2,4,2 k 1 中某幾個數的和表示,這個很...