#include "stdio.h"
#include "windows.h"
 
#define HIGHT    6
#define MAX_NUM_TEAM 6
 
int nConsumption[MAX_NUM_TEAM+1] = {0,1,2,2,2,3,3};//每个人每天的消耗量
int nMaxCarry[MAX_NUM_TEAM+1] = {0,7,8,17,18,22,25};//每个人最大的携带量
int nNeed[MAX_NUM_TEAM+1] = {0};//x个人总的消耗量
int nTake[MAX_NUM_TEAM+1] = {0};//x个人总的携带量
int nHigh[MAX_NUM_TEAM+1] = {0};//第x个人的返回高度
int nWhoInSelected[MAX_NUM_TEAM+1] = {0};//记录哪些队员被选中来登山
 
int minH[MAX_NUM_TEAM+1] = {0};
int minNeed = 123456789;
int minTake[MAX_NUM_TEAM+1] = {0};
int minMember = MAX_NUM_TEAM;
int minTeam[MAX_NUM_TEAM+1] = {0};
 
void Search(int k, int nDayUse)
{
 int i = 1;
 int j = 1;
 if(k > MAX_NUM_TEAM)
 {
  return;
 }
 for(i = 1; i <= MAX_NUM_TEAM; i++)
 {
  int nSelected = 0;
  for(j = 1; j <= k; j++)
  {
   if(nWhoInSelected[j] == i)//是否已经被选中
   {
    nSelected = 1;
    break;
   }
  }
  if(nSelected == 0)
  {
   if(nHigh[k-1] * nConsumption[i] > nMaxCarry[i])//自己供给不足
   {
    continue;
   }
   nWhoInSelected[k] = i;
   
   nNeed[k] = nNeed[k-1] + 2 * nHigh[k-1] * nConsumption[i];
   if(nNeed[k] >= minNeed)//是否具备最小消耗量的条件
   {
    continue;
   }
   
   nTake[k] = nTake[k-1] + nMaxCarry[i];
   if(nNeed[k] <= nTake[k])//完成一次登山队伍组建
   {
    minNeed = nNeed[k];
    minMember = k;
    nTake[k] = nNeed[k];
    
    for(j = 1; j <= k; j++)
    {
     minTeam[j] = nWhoInSelected[j];
     minTake[j] = nTake[j] - nTake[j-1];
     minH[j] = nHigh[j-1];
    }
   }
   else//计算新的供给高度,并选择下一个登山队员
   {
    int d = nNeed[k] - nTake[k];
    int nDayUseNow = nDayUse + nConsumption[i];
    int nNewHigh = d / nDayUseNow;
    if(nNewHigh * nDayUseNow == d)
    {
     nHigh[k] = nNewHigh;
    }
    else
    {
     nHigh[k] = nNewHigh + 1;
    }
    Search(k+1,nDayUseNow);
   }
  }
 }
}
 
void main()
{
 int i = 0;
 nHigh[0] = HIGHT;
 Search(1,0);//从选择第一个登山队员开始
 printf("%d team member to work need %d\r\n",minMember,minNeed);
 for(i = 1; i <= minMember; i++)
 {
  printf("Member %d to high %d\r\n",minTeam[i],minH[i]);
 }
}