求一组战力值最大算法

原创 2013年12月03日 09:48:45

在论述上看到此问题,觉得有点意思,写段代码 欢迎大家测试拍砖


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




求N个数的最大公因数(算法)

在一般的程序设计书里面,都有关于求两个数的最大公因数的算法(或者叫做最大公约数)。求两个数的最大公约数算法用的最多的是辗转相除法。 基本思路就是 getCommonMutiple(a,b)...
  • benma378
  • benma378
  • 2013年08月25日 22:29
  • 4852

实现在一组数中找出最大值与最小值

废话不多说,直接上代码。。。 第一种方法 先利用数组中的sort方法对数组的数进行排序(我在这里采用升序的方式(return b-a;就是实现数组的降序)),然后排序后的数组首尾肯定是最小值和最大...
  • CherryLee_1210
  • CherryLee_1210
  • 2017年11月02日 23:44
  • 340

C++算法 - 求输入数中的最大值

问题及代码: 运行结果: 知识点总结: 学习小结:
  • hexiaole1994
  • hexiaole1994
  • 2014年10月29日 22:46
  • 1147

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

之前参加百度校招时遇到过一道“求一组线段的最大重叠区域”的算法题,当时没有搞定,汗颜!今天在网上看到了一位高手写的答案,恍然大悟,茅塞顿开!看了高手的解答之后才知道原来真不难,再次汗颜!将题目和代码如...
  • lewsn2008
  • lewsn2008
  • 2013年03月01日 15:32
  • 3585

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

题目 给定整数数组A[0...N-1],求这N个数排序后最大间隔。如1,7,14,9,4,13的最大减个为4。 排序后:1,4,7,9,13,14,最大间隔是13-9=4 显然,对原来数...
  • HelloNiGeSB
  • HelloNiGeSB
  • 2016年12月06日 15:33
  • 540

设计一组N个数,确定其中第k个最大值

今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值。       名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,...
  • u012138828
  • u012138828
  • 2014年08月28日 22:40
  • 766

计算最大值和最小值(分治法)

分治法计算最大值和最小值,是一个经典的算法程序。 原始数据使用随机函数生成。 采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。 数据个数由宏定义给出,也...
  • tigerisland45
  • tigerisland45
  • 2016年04月21日 12:17
  • 1490

Java 分治法 求解一组数组元素的最大值和最小值

分治法的思想: 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。分治法的设计思想,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,从小的问题...
  • wodedipang_
  • wodedipang_
  • 2016年06月28日 22:53
  • 2463

同时得到最大最小值的最优算法

首先,我们将一对输入元素进行比较,然后把较小的值与最小值比较,较大值与最大值比较。这样,每两个元素共需3次比较。 如果n是奇数,就把最大最小值的初值都设为第一个元素的值,然后成对处理剩下的元素;如果n...
  • huanle543
  • huanle543
  • 2015年11月18日 08:51
  • 1949

求一个数组中两个元素的最大差值

一个整数数组a[n],在a[n]中找两个数字,使得下标大的数字减去下表小的数字所得的差值最大,即: 在a[n]中找 a[i] 和 a[j] ,使得 a[i] - a[j] 的值最大,并且 i > j...
  • stormbjm
  • stormbjm
  • 2013年09月28日 20:52
  • 3782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求一组战力值最大算法
举报原因:
原因补充:

(最多只允许输入30个字)