❶ 有一堆石头,分成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,还有一种排序叫做堆排序的同样也是以其为基础的