給定n
數字和總和s
的列表,將這些數字分組到two
組中,使得每組中的數字總和爲less than or equal to s
。如果可以分組,則打印YES
,如果不能分組,則打印NO
。將整數列表分組爲兩個組
例如,如果n=3 , s=4
和n
的數字是2,4,2
。 在這種情況下,輸出爲YES
,因爲可以形成的兩個組爲(2,2) and (4)
。
我的解決方案如下。
A
是包含n個數字的整數數組。
first group
包含第一組元素的總和。
second group
包含第二組元素之和。
溶液1
- 排序以降序排列。
- 繼續向第二組添加數字,直到該組中元素的總和小於或等於
s
。 - 計算用於第一組的總和減去
sum of all elements
sum of elements in second group
如果每個組中的元素的總和小於或等於
s
,然後打印YES
別的打印NO
。qsort (A, n, sizeof(int),compare); int second_group=0; f=0; for(i=0;i<n;++i) { if((second_group+A[i])==s) { f=1; break; } else if((second_group+A[i])<s) { second_group+=A[i]; } } int first_group=sum_of_all_elements-second_group; if(f==1) { cout<<"YES\n"; } else if ((second_group<=s) && (first_group<=s)) { cout<<"YES\n"; } else { cout<<"NO\n"; }
溶液2 使用Greedy approach
- 排序以降序排列。
- 將數組中的第一個元素添加到第一組。
- 迭代其餘元素並將每個元素添加到具有最小總和的組中。
如果兩個組的元素的總和等於
sum_of_all_elements
,則打印YES
否則打印NO
。qsort (A, n, sizeof(int),compare); int first_group=0,second_group=0; f=0; first_group=A[0]; for(i=1;i<n;++i) { if(first_group<second_group) { if((first_group+A[i])<=s) first_group+=A[i]; } else { if((second_group+A[i])<=s) second_group+=A[i]; } } if((first_group+second_group)==sum_of_all_elements) cout<<"YES\n"; else cout<<"NO\n";
問題
上述兩種解決方案爲不正確的答案。我無法理解他們失敗的場景。
如果有人能幫助我解決這個問題的其他解決方案,那將是非常好的。
考慮s = 6,n = 3和元素爲2,5,5',它通過你的情況,但仍然回答是「否」。 – g4ur4v 2014-09-21 21:42:52