❶ 有一堆石頭,分成6堆,每堆石頭數目不一樣,且每堆石頭位置固定,用最少步奏把石頭平均分開,說下思路
先來個 求和 ,平均值 ,
然後 一個石頭堆 開始 ,判斷 該石頭堆是 大於 平均值 還是 小於,如果大於,就 便利 其他的石頭堆 ,然後 從 該隊中 取出 多餘的 放到 下一個
❷ 35個石子分成9堆每堆的石子數不一樣能分嗎
不能
按最小的情況來算,9堆分別有石子1、2、3、4、5、6、7、8、9顆
至少需要石子:1+2+3+4+5+6+7+8+9=45顆
大於35顆
所以不能分
❸ pascal問題 分石堆
其實回溯沒必要這么復雜
像下面這樣就可以了
(每塊石頭只有兩種可能 在第一堆或者在第二堆
k代表第k塊石頭 sum代表第一堆的總和[第二堆就是全部石頭的和減去第一堆])
我很不明白上面程序中
for i:=k+1 to 2*n do
begin
b[k+1]:=a[i];
sh(k+1)
end;
是什麼意思
而且過程中的變數初始值不是0 上面程序s,s1都應該賦值為0
且在過程用的變數應該在過程中聲明
上面程序的過程里應該聲明i為integer
var a:array[1..1000]of longint;
c,n,i,h:longint;
procere sh(k:longint;sum:longint);
begin
if k>=2*n+1 then begin
if abs(h-sum-sum)<c then c:=abs(h-sum-sum);
exit;
end
else begin
sh(k+1,sum+a[k]);
sh(k+1,sum);
end;
end;
begin
c:=maxlongint;
readln(n);
for i:=1 to 2*n do begin readln(a[i]);h:=h+a[i]; end;
sh(1,0);
writeln(c);
end.
❹ 演算法問題,什麼是堆什麼不是堆好像覺得隨便給個數組都說對求教啊。。那就給一個7的數組 這也是堆嗎
堆分為最大堆和最小堆兩種。
對於一個數組a[n],任取一個元素a[i],若滿足以下兩個條件,則可以說這是一個最大堆:
1.若i滿足2i+1<n,一定有a[i]>a[2i+1];
2.若i滿足2i+2<n,一定有a[i]>a[2i+2]。
對於一個數組a[n],任取一個元素a[i],若滿足以下兩個條件,則可以說這是一個最小堆:
1.若i滿足2i+1<n,一定有a[i]<a[2i+1];
2.若i滿足2i+2<n,一定有a[i]<a[2i+2]。
為了更直觀地理解,可以用二叉樹來描述:即所有非葉節點元素關鍵字都大於其左右孩子(如果有左右孩子)的關鍵字。
舉個例子說明:設數組a[7]={55,18,8,57,52,24,2},此時還不是最大堆,調整為最大堆後為a[7]={57,55,24,18,52,8,2}
❺ 有沒有什麼演算法把一堆數據分為高低兩組的
7Zip極限壓縮,效果最好,數據文件實測壓縮率可達15%,已壓縮文件可達80%!唯一缺點是解壓和壓縮同時極慢!想要速度可以用Zip!但Zip效果可能最差!
❻ 石子分堆
這個根本是你的思路問題,這道題的解法是動態規劃。狀態轉移方程為f( j ) = f( j ) || f( j - w[ i ] )
f( j )表示能否選出總和為j的石子
然後尋找最接近所有石子總合的石子數量即可,程序如下。
#include <iostream>
using namespace std;
int main( )
{
int w[ 1000 ], n, i, j, sum = 0;
bool f[ 100000 ];
cin >> n;
for ( i = 0; i < n; i++ )
{
cin >> w[ i ];
sum += w[ i ];
}
for ( i = 0; i <= sum / 2; i++ )
f[ i ] = false;
f[ 0 ] = true;
for ( i = 0; i < n; i++ )
for ( j = sum / 2; j >= w[ i ]; j-- )
f[ j ] = f[ j ] || f[ j - w[ i ] ];
for ( j = sum / 2; j >= 0; j-- )
if ( f[ j ] )
break;
cout << sum - j * 2 << endl;
return 0;
}
❼ 什麼是堆演算法結構裡面的。
堆結構,又叫「堆棧結構」。是電腦里經常用到一個名詞。舉例:在我們日常生活中,當你往一個很小的容器里放東西,先放進去的東西,再倒出來時,一定落再後面,而後放進去的一定先倒出來,這就是堆棧結構的基本原理。早期的計算機對數據的處理就是基本是這個原理。就做串型原理。這種結構有個好處,要處理的數據能有條不紊地處理,減少計算機誤操作的幾率。但這種結構一個最大的缺點就是處理速度慢。在當今的科學技術如此發達處理數據如此多的狀態下,難以完成任務。如是就發明了並行結構,用一個處理器根據條件來對數據進行處理,而不是要一個一個地去選擇執行,這樣大大提高了數據處理的效率。後來人們在此基礎上再增加處理器,這樣處理數據的速度更快了。
❽ n個不同的物品,分成M堆,每堆至少一個。問有多少種分法,求高效率的演算法。
在n個物體中,先選出m個物體,每一堆放一個,這樣有A(m)(n)=n*(n-1)*....*(n-m+1)種情況,然後其餘的物品隨便放,有m^(n-m)種情況,兩者相乘就是答案
❾ 排列組合 平均分堆為什麼要除以堆數的階層
這里舉一個簡單的例子說明一下
甲乙丙丁4個人平均分成2組
那麼有(4C2)*(2C2)/(2A2)=3種情況,很明顯甲乙,甲丙,甲丁(兩組中一組的情況)三種情況,因為選好1組以後,剩下一組就不用分了,自動分成了一組
而如果不除以分組的階乘,那麼就會有重復出現,4C2*2C2中,有甲乙,甲丙,甲丁,乙丙,乙丁,丙丁(兩組中一組的情況),這時候甲乙和丙丁一組會與丙丁和甲乙一組重復,所以要排除重復的情況:2組的全排列2A2
同理,6個人abcdef均分為3組
任選一組ab,ce,df,按6C2*4C2*2C2的演算法,會有3A3種情況重復,即ab,ce,df三組的全排列
所以6人分3組答案為6C2*4C2*2C2/3A3
❿ 演算法 堆是怎樣的一種結構
堆有兩個含義,一個是用於動態分配用的堆區,另外一個是一種很重要的數據結構
以下說明都是關於後面的堆:
存儲結構是順序,邏輯結構是完全二叉樹,按照各數據元素關鍵碼的次序不同分為大根堆(也就大頂堆)和小根堆(也叫小頂堆),建立好初始堆,就可以在得到單獨的最大值(大根堆)或者最小值(小根堆)後,以最短時間(O(log2n))再次得到第二大(或者第二小)的關鍵碼值,並且保持結構還是堆,一般用於優先順序隊列的實現,像C++stl的priority_queue,還有一種排序叫做堆排序的同樣也是以其為基礎的