整体思路:关键是需要知道当前Steps数组中的全排列即可,而且需要不重复的全排列。即关键在于非递归的全排列实现即可~ 其实直接利用STL中的next_permutation算法的,这里我又自己实现了一遍该算法,当练练手了~

 #include <iostream>
#include <fstream>
#include <string>
#include <istream>
#include <algorithm> using namespace std; void Swap(int& a, int&b)
{
int tmp = a;
a = b;
b = tmp;
} void ReverseArr(int *arr, int nBegin, int nEnd)
{
while (nBegin < nEnd)
{
Swap(arr[nBegin],arr[nEnd]);
nBegin++;
nEnd--;
}
} int printArr(int *nCard, int nCountOfCard, int *nStep, int nCountOfStep)
{
// 将当前结果输出,返回最大值
int nValue = nCard[];
cout<<"Card["<<<<"]"<<"("<<nCard[]<<")+";
int nIndexOfCards = ;
for (int i = ; i!=nCountOfStep; i++)
{
// 取出等式中的结果
int nIndex = nStep[i];
nIndexOfCards += nIndex;
nValue += nCard[nIndexOfCards];
cout<<"Card["<<nIndexOfCards<<"]"<<"("<<nCard[nIndexOfCards]<<")"; if (i == nCountOfStep - )
{
cout<<" = "<<nValue;
}
} cout<<endl; cout<<"步骤为:";
for (int i=; i!= nCountOfStep; i++)
{
cout<<nStep[i]<<" ";
} cout<<endl;
return nValue;
} // nCard 记录每一张卡片代表的值
int GetTheMostValue(int *nCard, int nCountOfCard, int *nStep, int nCountOfSteps)
{
// 获取步骤数的全排列 然后根据每个步骤则可以得到最终的value 然后选其中最大的即可
sort(nStep,nStep+nCountOfSteps);
//
int nResult = ;
while()
{
int nValue = printArr(nCard,nCountOfCard,nStep,nCountOfSteps); if (nValue > nResult)
{
nResult = nValue;
} for (int i = nCountOfSteps - ; i >= ; i--)
{
bool bFlag = false;
int ii = i+;
if (nStep[i] < nStep[ii])
{
// 找到相邻的 升序了
for (int j = nCountOfSteps-; j >= ; j--)
{
if (nStep[j] > nStep[i])
{
Swap(nStep[j],nStep[i]);
// 然后从ii开始到尾部 进行逆序]
ReverseArr(nStep,ii,nCountOfSteps-);
// 设置标志位 跳出两层循环
bFlag = true;
break;
}
}
// 跳出外层循环
if (bFlag)
{
break;
}
}
else if (i == )
{
// 已经结束
return nResult;
}
}
}
} int main()
{
fstream file;
file.open("E:\\2.txt");
if (file.is_open(),ios::in)
{
int nCountOfCard;
int nCountOfStep;
string str;
// 读取卡片数量和步数的个数
file>>nCountOfCard>>nCountOfStep; int *cards = new int[nCountOfCard];
int *steps = new int[nCountOfStep]; for (int i = ; i!= nCountOfCard; i++)
{
file>>cards[i];
} for (int j = ; j!= nCountOfStep; j++)
{
file>>steps[j];
} //计算各个组合~
// 其实就是将步骤数进行全排列 然后将每种组合结果输出即可~~ 在此过程中进行比较
// 使用非递归的方法吧
int nMaxValue = GetTheMostValue(cards,nCountOfCard,steps,nCountOfStep);
cout<<"最大的结果为:"<<nMaxValue<<endl; delete[] steps;
delete[] cards;
}
file.close();
return ;
}

最新文章

  1. javascript学习笔记全记录
  2. Java成员初始化顺序
  3. css3学习总结9--CSS3过渡
  4. 查找练习 hash——出现过的数字 分类: 查找 2015-06-18 17:30 7人阅读 评论(0) 收藏
  5. MySQL 5.7.9 免安装配置
  6. java多线程编程(2)交替输出数字和字母
  7. IOS网络开发实战(一)
  8. 建造者(Builder)模式
  9. JDK环境安装步骤
  10. Kubernetes helm配置国内镜像源
  11. 用stringstream可以用来分割空格、tab、回车换行隔开的字符串:
  12. Artifact project04:war :Error during artifact deployment. See server log for details
  13. 怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
  14. Dockerfile的 RUN和CMD
  15. Quartz在Spring中动态设置cronExpression
  16. 打开Word时出现“The setup controller has encountered a problem during install. Please ...”
  17. 简短而有效的python queue队列解释
  18. css未知宽高的盒子div居中的多种方法
  19. 09、win32 转换为 store app
  20. 什么是Apache ZooKeeper?

热门文章

  1. 探索 OpenStack 之(8):Neutron 深入探索之 OVS + GRE 之 完整网络流程 篇
  2. Burpsuite 重要插件
  3. 【译文】 GC 安全点 和安全区域
  4. 【URLDecoder】java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es
  5. 原生JavaScript技巧
  6. 微信&quot;流量红包&quot;的玩法攻略 广东移动用户有福啦
  7. php项目整理之no1
  8. Eclipse 设置SVN忽略文件
  9. tornado 重定向404(方法不对)
  10. POI导出excel日期格式