#include "stdio.h"
#include "windows.h"
#include "windows.h"
#define HIGHT 6
#define MAX_NUM_TEAM 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 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};
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;
{
int i = 1;
int j = 1;
if(k > MAX_NUM_TEAM)
{
return;
}
{
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;
}
{
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];
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;
}
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);//从选择第一个登山队员开始
{
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]);
}
{
printf("Member %d to high %d\r\n",minTeam[i],minH[i]);
}
}
转载于:https://blog.51cto.com/bluefish/60544