比如有15个苹果,5个人分,我想分配结果是:
5,4,3,2,1
这样依次递减下去,
如果有16个苹果,5个人分结果是:
6,4,3,2,1
总之要求是第二名到最后一名都是依次递减1,或者2,可控制的。
最后一个人永远是得1个。多的可以算到第一个人身上去。并且要把苹果正好分配完。
如果苹果少于分配的人数或者无法按要求分配等,则可以给出提示。哪位大哥给出一个完整的算法啊。。

解决方案 »

  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;
    }
      

  2.   

        private int getSNum(int pn, int step)
        {
            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;
        }
      

  3.   


    /// <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;
        }
      

  4.   

    作业// Apple.cpp : 定义控制台应用程序的入口点。
    //#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;
    }