###### 求一组战力值最大算法

http://bbs.csdn.net/topics/390656629?page=1#post-396237502

"一组卡牌，从中抽取12张牌，每张卡牌的属性有战力值和COST值，要求是12张牌加起来的战力值取大，但COST加起来必须小于一个定值，求这样的算法"

typedef struct _tagCard_t
{
int iCost, iValue;
_tagCard_t()
{
iCost = iValue = 0;
}
}CARD;

template <int NUM> struct CardSelct
{
int bSelected[NUM];
int iSelected;
int iCost, iValue;

CardSelct()
{
memset(this, 0, sizeof(*this));
}

CardSelct(CardSelct &other)
{
operator = (other);
}

void operator = (CardSelct &other)
{
for(int i=0; i<NUM; i++)
bSelected[i] = other.bSelected[i];
iSelected = other.iSelected;
iCost = other.iCost;
iValue = other.iValue;
}
};

template <int iTotalCard>
int Select(CardSelct<iTotalCard> &sel, int SelCardNum, CARD card[iTotalCard], int iMaxCost)
{
ASSERT(iTotalCard >= SelCardNum);
for(int i=0; i<iTotalCard; i++)
{
if(sel.iSelected >= SelCardNum) //数量已经足够
break;

CARD *pNewCard = &card[i];
if(sel.bSelected[i]) //已经被选中
continue;

//计算不包含此项的成本和价值
CardSelct<iTotalCard> unselThis = sel;
unselThis.bSelected[i] = -1;//仅标记
Select(unselThis, SelCardNum, card, iMaxCost);

//计算选择此项的成本和价值
CardSelct<iTotalCard> selThis = sel;
selThis.iCost += pNewCard->iCost;
selThis.iValue += pNewCard->iValue;
if(selThis.iCost <= iMaxCost)
{
selThis.bSelected[i] = 1; //标记选中
selThis.iSelected++; //选中数
Select(selThis, SelCardNum, card, iMaxCost);
}

if(selThis.iCost > iMaxCost //超成本
||(selThis.iValue < unselThis.iValue) //价值低
||(selThis.iValue==unselThis.iValue && selThis.iCost>unselThis.iCost) //价值相同但成本高
|| 0) //不选择此项
{
if(unselThis.iSelected > 0) //不选项也有效
{
sel = unselThis;
}
}
else
{
sel = selThis;
}
}

return sel.iValue;
}

void testCard()
{
//随机化数据
short seed = (short)time(NULL);
TRACE( _T("seed=%d\n"), seed);
srand( seed );

const int iCard=50; //50张卡
const int iSelect=12; //选12张
CARD card[iCard]; //卡
int iMaxCost = rand(); //限最高成本

//使用随机数填充卡成本和价值
{
for(int i=0; i<iCard; i++)
{
card[i].iCost = rand();
card[i].iValue = rand();
}
}
CardSelct <iCard> sel;
Select(sel, iSelect, card, iMaxCost);

//结果输出
{
TRACE(_T("Card= cost   value  sel(cost<%d)\r\n"), iMaxCost);
for(int i=0; i<iCard; i++)
{
TRACE(_T(" %03d [%06d %06d %+d]\r\n"),
i, card[i].iCost, card[i].iValue,
sel.bSelected[i]);
}
TRACE(_T("Total[%06d %06d %02d]\r\n"),
sel.iCost, sel.iValue, sel.iSelected);
}
}



#### 【算法题】百度笔试题——求一组线段的最大重叠区域

2013-03-01 15:32:30

#### 算法题：给出一组数字，拼接一个最大的值

2017-04-20 20:36:07

#### 【面试题】柱状图内最大的矩形面积

2016-09-11 22:34:44

#### 算法学习-数组的最大间隔

2016-12-06 15:33:26

#### POJ 1118(斜率，排序，找到最大的简单方法)

2016-05-19 20:20:00

#### 分治法：求一组数据中最大的两个数和最小的两个数

2018-01-18 16:44:26

#### 算法题--大数据取最大前几个

2017-03-03 09:49:45

#### 递归求最大最小值算法 分治策略(c语言实现)

2016-03-28 21:02:29

#### 求平面上N点最远两点和最近两点距离

2016-03-29 09:39:10

#### 算法-无序数列最大相邻大小差值

2014-08-19 17:26:52