演算法思想
將k個小球依次裝入到若干個盒子中去(可以使用的盒子數不限)。
小球裝入盒子的規則如下:
1)第乙個盒子不能為空。
2)依次裝入各個盒子的球數必須嚴格遞增。例如:當k=8時,裝入方法有1,2,5或1,3,4。
3)裝入的盒子數盡可能多。
4)所有相鄰盒子的球數之差的絕對值之和最小。
如上例中:裝入法1,2,5,則差的絕對值之和為(2-1)+(5-2)=4。裝入法1,3,4,則差的絕對值之和為(3-1)+(4-3)=3。因此應該採用後一種裝法。
程式要求從標準輸入裝置中讀入多組測試資料,每組測試資料僅佔一行,每行有乙個整數k(1 ≤k ≤10000),即小球的個數。
每組運算結果為一串整數,即表示依次放入各個盒子裡的小球的個數,每兩個數字之間用乙個『,』分隔。每組運算結果單獨佔一行,其行首和行尾都沒有任何空格或其他任何字元。
1
810
11,
3,41
,2,3
,4
貪心演算法求解:
先初始化乙個遞增序列,且序列的和小於與等於小球總數,這種情況下相鄰的數之差的和一定是最小的。
當然 n = 10 時序列之和剛好等於它,那如果序列和小於n呢?
此時序列只能為5項,如果序列為6項,則合為21,不符合題意此時小球數剩餘 20 - 15 = 5 個,接著序列從後往前,每項分乙個小球,直到小球分完為止。
序列變為 :2、3、4、5、6;
序列保持遞增且差的絕對值之和為4,一定是最小的。
#include
#include
#include
#include
#define max_size 200
intmain()
, numssize, sum, remnent;
while
(eof
!=scanf
("%d"
,&n)
) numssize = i;
remnent = n - sum;
// 從後往前沒人分乙個
for(i--
; remnent >
0; i--
, remnent--
) nums[i]++;
printf
("%d"
, nums[0]
);for(i =
1; i < numssize; i++
)printf
("\n");
}return0;
}
小球與盒子的問題
這類問題的基本模型是 你有 n 個小球,m 個盒子,現在想把這 n 個小球放進 m 個盒子中,問有多少種放的方法 但是只給出這樣的條件並不足夠,我們必須加上一些限制,否則結果是不確定的 一般加的有三個限制,即小球是否有區別 盒子是否有區別 允不允許有空盒子,也因此可以組合出八種不同的問題 接下來我們...
求精 關於N個小球放M個盒子解答
求精 關於n個小球放m個盒子解答 看似很簡單的問題其實非常複雜,球是否相同,箱是否相同?是否允許有空盒 不難看出一共8類情況 1 球同,盒同,無空箱 2 球同,盒同,允許空箱 3 球同,盒不同,無空箱 4 球同,盒不同,允許空箱 5 球不同,盒相同,無空箱 6 球不同,盒相同,允許空箱 7 球不同,...
演算法 放蘋果問題
1.在說放蘋果問題之前,先說下斐波那契數列遞迴求解時的時間複雜度。由公式f n f n 1 f n 2 很容易畫出其遞迴樹 每個節點都會呼叫一次f n 滿二叉樹節點數m 2 h 1,h是樹高度。則o n 2 n.2.放蘋果問題 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種...