brother louie什么意思:请教一个简单的算法问题(用VC实现)

来源:百度文库 编辑:高校问答 时间:2024/04/30 02:50:25
有一组整数a[0]、a[1]、a[2]……a[n],现将其按顺序分为若干堆,

分堆的规则是:如果这几个数的总和小于m,就将其分在一堆里。

例如:有6个整数11,15,21,8,17,20,让每堆数的总和小于31。则可以分为:
堆1:11,15; 堆2:21,8,; 堆3:17; 堆4:20

请问用VC程序如何实现?小小菜鸟请各位大侠不吝赐教!!!
这个是我自己编程时遇到的一个问题,并不知道它有什么名称啊

#include <iostream>
using namespace std;

#define count 6 //数组长度
#define max 31 //和的最大值

int main()
{
int num[count]; //用来存原始的数组
int store[2*count-1]={0,0,0,0,0,0,0,0,0,0,0}; //存处理后的数组
int i,j,k,total;

cout<<"请输入数据("<<count<<"个,且大小不能超过"<<max<<")\n";
for (i=0; i<count; i++)
cin>>num[i];
cout<<"你输入的数据为:\n";

for (i=0; i<count; i++)
cout<<num[i]<<"\t";
cout<<endl;

for(i=0,j=0,total=0;i<6;)
{
total+=num[i];
if(total>max)
{
store[j++]=max+1;
total=0;
}
else
{
store[j++]=num[i++];
}
}
cout<<"堆1:";
for(i=0,k=2;i<j;i++)
{
if(store[i]==max+1)
cout<<" 堆"<<k++<<":";
else
cout<<store[i]<<" ";
}
cout<<endl;
return 0;
}
稍微解释一下:
程序里面的数组大小及和的上限可以在程序前面3,4行改.
store数组用来存原始数据和标记,在每两个相邻的标记间的数就是一个堆,我用max+1来做,因为原始输入数据的每个值都不会超过max。
以11,15,21,8,17,20为例,
store中存的数据为11,15,32,21,8,32,17,32,20....(后面全为零);至于store为什么要去count*2-1是因为极限情况是一个数一堆。
输入数据可能会超过max,我这里没加对输入数据的校验,加的话也就写个if判断就行了。

这个算法题目的名称叫什么?