C語言演算法 小球放盒子問題

2021-10-03 17:44:44 字數 1370 閱讀 9461

演算法思想

將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個同樣的盤子裡,允許有的盤子空著不放,問共有多少種...