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 中某幾個數的和表示,這個很...