#include "windows.h"
#define MAX_NUM_TEAM 6
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 minNeed = 123456789;
int minTake[MAX_NUM_TEAM+1] = {0};
int minMember = MAX_NUM_TEAM;
int minTeam[MAX_NUM_TEAM+1] = {0};
{
int i = 1;
int j = 1;
{
return;
}
{
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;
}
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];
if(nNewHigh * nDayUseNow == d)
{
nHigh[k] = nNewHigh;
}
else
{
nHigh[k] = nNewHigh + 1;
}
}
}
}
}
{
int i = 0;
nHigh[0] = HIGHT;
Search(1,0);//从选择第一个登山队员开始
{
printf("Member %d to high %d\r\n",minTeam[i],minH[i]);
}