有這樣一道演算法題目:
144張牌放到若干的盒子中,
每個盒子中放10到
40張,
問有多少種放法?(不考慮順序)
由144/10=14.4
,144/40=3.6
可得,盒子的數量最少為4,
最多為14.
假設有n個盒子(
4<=n<=14),
每個盒子中分別放
a1, a2, …, an
張牌,由於不考慮順序,
不妨設a1
<=a2
<= … <=an.
然後可以根據盒子的數量進行窮舉,
從而得出答案。
考慮到14個盒子的情況,
30^14
是個很可觀的數字,
為了提高演算法的效率,
需要計算
ai(1<=i<=n)
的最大和最小值。
容易得出 ai
最小的情況是
a1=…=ai, ai+1=…=an=40
min(ai)=(144 – (n-i)*40)/i
ai最大的情況
a1=min(a1) a2= min(a2)…ai-1= min(ai-1), ai= ai+1=…=an
max(ai)=(144-min(a1)-min(a2)-...-min(ai-1))/i
#include
#include
#define count 144
#define maxval 40
#define minval 10
int count = 0;
int** minvals;
int** maxvals;
void get_min_max_vals ()
max = (count - temp) / (i - j);
maxvals[i - 4][j] = max > maxval ? maxval: max;
}
}
}
void calc (int cur, int total, int* vals)
if ((last >= vals[cur - 1]) && (last <= maxval))
return;
}
if (0 == cur) else
for (i = from; i <= maxvals[total - 3][cur]; i++)
}
int main()
printf ("total=%d/n", totalcount);
for (j = 0; j < 11; j++)
free(minvals);
free(maxvals);
return 0;
}
一道簡單題目的複雜演算法
這是我們第一節彙編上機的實驗題目,問題描述 在debug下實現,記憶體區2100h處有乙個位元組帶符號數 用e命令存入 要求程式設計將其取出1 若此數為正,則3000h單元置01h,2 若此數為0,3000h單元置0h,3 若此數為負,3000h單元置ffh。題目很簡單,應該說簡單得讓人做著無聊,於...
一道ACM題目的反思
大三本科,成績還算不錯 很不自謙的說 所有程式設計實驗做的津津有味,亦常為同學捉刀,最近的圖形學實驗寫了4600行c 自命程式設計能力還是不錯的。可自大一來嘗試acm便屢屢受挫,鬱鬱不得志,中途因課業緊張未能堅持 壓根沒正兒八經的做過幾道題 也自覺智商平平,無甚希望。最近在考研與工作間猶豫不決,無聊...
一道線代題目的總結
線性方程組 1 x1 2x2 3x3 4x 4 其中,i i 1 2,3 4,均是四維列向量,有通解 k 2,3 1,0 t 4,1 0,3 t三個小題 1 是否能由 2 3,4線性表出,若能,錶出之否則說明理由。分析 給定的是通解結構,我們能從中發現很多資訊。首先這是乙個非齊次方程組的通解。題幹給...