比如有15个苹果,5个人分,我想分配结果是:
5,4,3,2,1
这样依次递减下去,
如果有16个苹果,5个人分结果是:
6,4,3,2,1
总之要求是第二名到最后一名都是依次递减1,或者2,可控制的。
最后一个人永远是得1个。多的可以算到第一个人身上去。并且要把苹果正好分配完。
如果苹果少于分配的人数或者无法按要求分配等,则可以给出提示。哪位大哥给出一个完整的算法啊。。
5,4,3,2,1
这样依次递减下去,
如果有16个苹果,5个人分结果是:
6,4,3,2,1
总之要求是第二名到最后一名都是依次递减1,或者2,可控制的。
最后一个人永远是得1个。多的可以算到第一个人身上去。并且要把苹果正好分配完。
如果苹果少于分配的人数或者无法按要求分配等,则可以给出提示。哪位大哥给出一个完整的算法啊。。
int count=15;//苹果数;
int member=6;//人数;
int x=1;//最小差值;
int y=1;//当前人的分配数;
for(int i=1;i<=member;i++)
{
Console.WriteLine("第一人:"+y);
y+=x;
count-=y;
if(count<=0)break;
}
{
if (pn == 1) return 1;
if (pn == 2) return 1 + step + 1;
return getSNum(pn - 1, step) + step + getSNum(pn - 2, step);
} private int[] getNums(int pn, int wn)
{
int minW = getSNum(pn, 1);
if(minW > wn)
{
//苹果太少
return null;
}
int maxW = getSNum(pn, 2);
if(maxW < wn)
{
//苹果太多
return null;
} int[] nums = new int[pn];
nums[0] = 1;
while (minW < wn)
{
nums[pn - 1] = 1;
wn--;
pn--;
}
for (int i = 1; i < nums.Length; i++)
{
nums[i] = nums[i] + 1 + nums[i-1];
}
return nums;
}
/// <param name="appleCount">苹果总数</param>
/// <param name="personCount">人员总数</param>
/// <param name="step">配额差</param>
private int[] AssignApple(int appleCount, int personCount, int step)
{
//等差数列求和(1~n-1)项
int sum = (personCount - 1) * (2 + (personCount - 2) * step) / 2; //sum<苹果总数,则返回null
if (appleCount < sum)
{
return null;
} //从最后一名开始往前分配
int[] ret = new int[personCount];
for (int i = personCount - 1, j = 0; i > 0; i--, j++)
{
ret[i] = 1 + j * step;
} //第一名分配余下的苹果
ret[0] = appleCount - sum; return ret;
}
//#include "stdafx.h"
#include <iostream>
using namespace std;int getBefore(int people, int step)//获取除最后一人外所有人员分到的苹果
{
if(people==1)
return 1;
else
return people*step+(1-step)+getBefore(people-1, step);
}int getAppleByIndex(int index, int step)//获取第index人应分得的苹果,
{
return index*step+(1-step);
}
int _tmain(int argc, _TCHAR* argv[])
{
int people=5;//人数
int apple=30;//苹果数
int step=1;//步长,后一个和前一个的差
//这里做些必要的变量检查工作
if(apple<people)
{
cout << "苹果数量太少,或者人数太多"<<endl;
return 0;
}
if(step < 1)
{
cout << "步长必须为>=1的正整数"<<endl;
return 0;
}
if(apple-getBefore(people-1,step) < getAppleByIndex(people-1,step))
{
cout << "最后一名的数量小于倒数第二名的数量!请修改步长试试." <<endl;
return 0;
}
cout << "总人数:"<<people<<" 苹果数:"<<apple<<" 步长:"<<step<<endl;
for(int i=1;i<people;i++)
{
cout <<" 第"<<i<<"人: "<<getAppleByIndex(i,step)<<endl;
}
cout <<" 第"<<people<<"人: "<<apple -getBefore(people-1,step)<<endl;
return 0;
}