求一组战力值最大算法
2013-12-03 09:48
429 查看
在论述上看到此问题,觉得有点意思,写段代码 欢迎大家测试拍砖
http://bbs.csdn.net/topics/390656629?page=1#post-396237502
"一组卡牌,从中抽取12张牌,每张卡牌的属性有战力值和COST值,要求是12张牌加起来的战力值取大,但COST加起来必须小于一个定值,求这样的算法"
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); } }
相关文章推荐
- 基于ASP.NET MVC+Linq等技术下的企业级通用OA系统全程开发 (2013-12-02 13:37:52)[编辑][删除]
- C++简单的文件I/O操作
- XP配置路由功能
- php生成导出Word、Excel、PowerPoint插件
- 无刷新删除数据 删除过程中渐变显示当前删除的行
- APC UPS 冷热启动原因
- 和는 中運動)의 極致
- sql2000 SP4不能远程连接
- 区别C#中的两个属性(Property和Attribute)
- hadoop学习(一)hadoop-1.2.1伪分布式配置及遇到的问题
- XMPP 代理文件传输Socket 5协商过程
- 评价对象抽取综述
- hdu1151Air Raid
- 第四章 数据查询2 (上机)
- 创意的秘密
- 解决Eclipse,MyEclipse出现An error has occurred,See error log for more details的错误
- 【机器学习-斯坦福】学习笔记10 K-means聚类算法
- R.NET项目介绍 项目地址
- __declspec(align(#))
- Hadoop之Hbase数据库完全分布模式安装guide