CJOJ2736 POJ1014 大理石分割

2022-03-29 09:02:58 字數 1481 閱讀 6725

marsha和bill收藏了一些大理石。他們想要把這些大理石平均分配給兩個人。如果大理石的價值一樣,這將很容易做到,因為他們可以簡單的對半分。不幸的是,一些大理石比其他的更大或者更漂亮。因此marsha和bill給每個大理石都規定了乙個價值,它是乙個1~6之間的自然數。現在他們想要把這些大理石分成兩部分,每部分的價值之和相等。但他們很快意識到有可能不存在這樣的分法(即使大理石的價值之和是偶數)。例如,如果大理石的價值分別是1,1,3,4,4,就不可能被分為總價值相等的兩部分。因此,他們請你寫乙個程式,判斷是否存在公平的分法。

輸入包含多組資料。

每組資料由1行,包含6個正整數n1~n6,其中ni是價值為i的大理石數量。因此題目描述中的例子可以被表示為"1 0 1 2 0 0"。大理石的總數不超過20000.

對第k組資料,輸出一行"collection #k:",再輸出一行"can be divided."或"can't be divided.",然後再輸出乙個空行。

1 0 1 2 0 0

1 0 0 0 1 1

0 0 0 0 0 0

collection #1:

can't be divided.

collection #2:

can be divided.

其實考場的時候我對於我自己的想法十分的窒息,我竟然用貪心?很鬼畜啊,這果然不是我...

然後這道題目顯然一眼看得出,是多重揹包,然後看到揹包就知道不用二進位制肯定過不了,然後果斷寫上二進位制,然後就切了.

特別注意多組資料注意清零陣列...(我最近的操作真是令人絕望)

#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define re register

inline int gi()

while(ch>='0' && ch<='9')

return sum*f;

}int n,a[7],dp[1000010],t[1000010];

int main()

if(sum==0)break;

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

if(sum%2)puts("can't be divided.");

else

t[++count]=i*weight;

}sum/=2;

for(re int i=1;i<=count;i++)

for(re int j=sum;j>=t[i];j--)

dp[j]=max(dp[j],dp[j-t[i]]+t[i]);

if(dp[sum]==sum)puts("can be divided.");

else puts("can't be divided.");

}puts("");

}return 0;

}

poj解題報告 1014

題意 有分別價值為1,2,3,4,5,6的6種物品,輸入6個數字,表示相應價值的物品的數量,問一下能不能將物品分成兩份,是兩份的總價值相等,其中乙個物品不能切開,只能分給其中的某一方,當輸入六個0是 即沒有物品 這程式結束,總物品的總個數不超過20000 如下 include includeint ...

poj 1014 硬幣分割

poj 1014 經典多重揹包問題 by baiwenlei 題目大意 給出一些價值在1 6範圍間的彈珠,判斷是否能夠按照價值等分 解題思路 多重揹包問題,不過本題中若價值不是偶數,直接返回即可 最後注意輸出的時候要求case之間有乙個空行,最後乙個case結束以後不空行。否則presentatio...

POJ 1014 解題報告

這道題我用的是最原始的dfs,雖然加了cache,避免了一些重複運算,但不出意料地tle了。然後就是 優化 把每個value中的item個數減到200以下 看discuss可以取到30甚至6的,還有一堆mod的解法 我都不明白這些優化的原理。見源 中注釋掉的dfs部分。1014 accepted 3...