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...