一个菜鸟学习动态规划算法的过程
这段时间在看基因调控网络相关的文章,涉及最多的就是评分函数和搜索算法,而搜索算法中比较经典的算是贪心算法(局部最优)了,于是我拿起了算法导论这本书来摸索,看着看着,发现还是要先看一下动态规划才比较有基础,然后发现还是得先看看分治模式才比较靠谱,于是故事就这样开始了、、、、、
先是编程上面遇到的问题,由于本人不是计算机专业的,但是很热爱计算机,所以C、C++、JAVA都有涉及,但是最坑爹的是经验不足,败在了函数上面,所以,只能多看文档啦,先说说今天动态规划遇到的问题
#include <iostream>
#include <algorithm>
using namespace std;
int cut_rod(int *p, int n);
int main()
{
int q, n, p[11] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30}; //q为最大价格,n为钢材长度,p数组为价格目录
cout << "请输入钢材的长度:";
cin >> n;
q = cut_rod(p, n);
cout << "最大收益为 "<< q << endl;
return 0;
}
int cut_rod(int *p, int n)
{
int q = -1e8;
if (n == 0)
{
return 0;
}
else
{
for(int i = 1; i <= n; i++)
{
q = max(q, p[i] + cut_rod(p, n-i));
}
}
return q;
}
这是我自己写的一个关于求一个n长的钢条的最有切割问题的递归算法,当n=17的时候都没有问题,可是到18后就开始出现一堆不知所云的东西了,于是上网找了个靠谱的算法
#include<iostream>
#include<cstring>
using namespace std;
int p[1000],r[1000],s[1000];
void cut_rod(int* a,int b)
{
r[0]=0;
for(int i=1;i<=b;i++)
{
int q=-1e8;
for(int j=1;j<=i;j++)
{
if(q<(a[j]+r[i-j]))
{
q=a[j]+r[i-j];
s[i]=j;
r[i]=q;
}
}
}
cout<<r[b]<<endl<<s[b]<<endl;
}
int main()
{
int n;
cin>>n;
memset(p,0,sizeof(p));
memset(r,0,sizeof(r));
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)
cin>>p[i];
cut_rod(p,n);
return 0;
}
由于本人小菜,第一下就被主函数里面的memset()函数懵到了,或许是他太不耀眼了,看了很多书和视频都没有发现过他的存在,于是百度了一下,总结了一些大神经验,这里简洁介绍下
#include "iostream.h"
#include "string.h"
#include <afx.h>
int
main(){
char
buf[5];
CString str;
CString str1;
CString str2;
memset
(buf,0,
sizeof
(buf));
for
(
int
i = 0; i<5; i++){
str.Format(
"%d"
,buf[i]);
str1 +=str ;
}
str2.Format(
"%d"
,str1);
cout<<str2<<endl;
system
(
"pause"
);
return
0;
}
CString str;
int number=15;
//str="15"
str.Format(_T("%d"),number);
//str=" 15"(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
str.Format(_T("%4d"),number);
//str="0015"(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
str.Format(_T("%.4d"),number);
long转换为CString的方法与上面相似,只需要把%d改为%ld就可以了