几首算法题,麻烦讲一下思路

lesbuy 2009-09-16 11:00:30
就给一个大致的思路就行,比如用什么样的算法的大致的步骤框架。谢谢了

1、一个长度不超过200的数字串,由1到9的数字组成,将M个加号(M〈=20)插入到数字串中,使形成的数字表达式最小。

2、各城市之间有路程,现在从某城市出发,经过所有的城市一遍,最后回到起点,使总路程最短。

3、有N个硬币(N〉=10),正面向上,每次翻5个硬币,直到全部反面向上。
...全文
226 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenmekenen 2009-09-20
  • 打赏
  • 举报
回复
都是数据结构的问题,建立图或者树模型,求搜索后回溯找出路径应该可以
qingkongyihe2008 2009-09-19
  • 打赏
  • 举报
回复
-
wxsxiaoK 2009-09-19
  • 打赏
  • 举报
回复
第二题动态规划,哪位高手写个代码学习下啊~
herman~~ 2009-09-19
  • 打赏
  • 举报
回复
mark
simon582 2009-09-19
  • 打赏
  • 举报
回复
1、DP 15楼的似乎不错..
2、TSP问题 应该还是NP类的吧而不是没有最优解 一般采用启发式搜索
3、这个貌似有后效性不能DP解. [ 如果有大牛用DP解了让我膜拜下 ] 搜索的话似乎没啥技术含量..

11楼的第三题算法没看懂 = =
danxuezx 2009-09-18
  • 打赏
  • 举报
回复
这题目都是数学建模课本上的题目
ketet 2009-09-18
  • 打赏
  • 举报
回复
第一题应该可以用DP的思想来做。
knate 2009-09-18
  • 打赏
  • 举报
回复
1、一个长度k不超过200的数字串,由1到9的数字组成,将M个加号(M〈=20)插入到数字串中,使形成的数字表达式最小。

L = k/M + log(M) +2;

sum(M,k) = (min(sum(M-1,k - i)+ X(k-i,k)) ;
// sum(M,k) 为把M个加号划分k个字符的字符串.X(k-i,k)为字符串标号为k-i,k构成的一个数.
//M= 1 时为唯一种划分.
//利用 M * L >= k 能够有效缩小搜索范围.即大致均分的上限值.
//具体细节不表
失落的凡凡 2009-09-17
  • 打赏
  • 举报
回复
据说第二题至今仍然没有最优解
aopha 2009-09-17
  • 打赏
  • 举报
回复
问题1取平均,让后让最小的一个数最大
问题2我想到的是穷举
问题3递归
snake4 2009-09-17
  • 打赏
  • 举报
回复
本来想写个翻币的循环的!
不过看来省了。。
 opt = new char[count];
for(int i=0; i<count; i++)
opt[i] = 0;

这段代码也省了。
snake4 2009-09-17
  • 打赏
  • 举报
回复
第三题不是算法题,呵呵

#include <string>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
int count = 23;
char* opt;
cout<<"count:";
cin>>count;
opt = new char[count];
for(int i=0; i<count; i++)
opt[i] = 0;
int count_RMB =0;//翻人民币的次数。
count_RMB = count/5;
switch(count%5)
{
case 1:
count_RMB += 1;
break;
case 2:
count_RMB += 2;
break;
case 3:
count_RMB += 1;
break;
case 4:
count_RMB += 2;
break;
default:
break;
}
cout<<"硬币个数:"<<count<<endl;
cout<<"翻币次数:"<<count_RMB<<endl;
return 0;
}

呵呵!!这叫算法码?
snake4 2009-09-17
  • 打赏
  • 举报
回复
第一题:
平均分配位数。比如有100位,分10个数,那每个数10位时最小。
步骤:
1.N%M==0的话就直接没N/M位为一个数
2.N%M!=0的话就分成N/M+1段。其中有段是N%M位。此时就要从位数最多的数字中查找最小的!
动态规划法比较快。。

第二题
好像是算法里面的 邮递员问题。你搜一下应该有不少答案的

第三题
假设有N个硬币。先翻N/5*5个。注意:如果N==23,N/5*5=20
此时剩下3个硬币,那还不简单。
翻4翻就可以了。。
至于程序实现嘛,呵呵!!应该是设置一个循环。
把硬币设置成bool RMB[23];
然后循环。一旦变成1就退出循环。。
写写看。。
lesbuy 2009-09-17
  • 打赏
  • 举报
回复
能不能讲一下第一题动态规划的具体过程
wesweeky 2009-09-17
  • 打赏
  • 举报
回复
看看
knate 2009-09-17
  • 打赏
  • 举报
回复
第一题
死方法是动态规划一下划分.
好一点的话就是大致估计一下划分步长,然后使用动态规划.

第三题:
带负边(5,3,1,-1,-3,-5)
到任意5k点的最小距离.
使用 带负边的两点的最短距离 算法.(算法导论有现成的)
如果不求少步骤则全部划分到(0-4)区域,然后是(1-4)到5k的步骤


第二题
基本给出题出烂了.
gumbour 2009-09-16
  • 打赏
  • 举报
回复
1、一个长度不超过200的数字串,由1到9的数字组成,将M个加号(M〈=20)插入到数字串中,使形成的数字表达式最小。
假设长度是N,

则每段长度为A/A+1. A=N/M K=N%M 其中长度为A+1的段有K段,其余段长度为A。
这个结论应该可以由反证法简单证出,我就不证明了。

接着最烂的算法就可以用0/1背包问题了,M个东西取K个放入背包,
不过动态规划肯定也可以,而且速度更快
gumbour 2009-09-16
  • 打赏
  • 举报
回复
2题数据结构原题,不再废话
gumbour 2009-09-16
  • 打赏
  • 举报
回复
先一次翻5个,直到翻到正面不足5个为止(因为N大于10,所以我们后面几步用10个硬币操作)
1 反反反反反反反反反正----->
4 反反反反反正正正正反----->
3 反反反正正反反反正反----->
2 反反反反反正正反----->
正正正正反正反反反----->
反反反反反反反----->

剩余1,2,3,4个正面可相互转换状态,最多6步可以达到全反。
crst_zh 2009-09-16
  • 打赏
  • 举报
回复
1.基本上应该先平均分一下吧,比如1234567890,长度为10,3个+插入,先平均一下,这样接近最小的。
1234+567+890.
加载更多回复(1)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧