一个菜鸟学习动态规划算法的过程

    这段时间在看基因调控网络相关的文章,涉及最多的就是评分函数和搜索算法,而搜索算法中比较经典的算是贪心算法(局部最优)了,于是我拿起了算法导论这本书来摸索,看着看着,发现还是要先看一下动态规划才比较有基础,然后发现还是得先看看分治模式才比较靠谱,于是故事就这样开始了、、、、、

    先是编程上面遇到的问题,由于本人不是计算机专业的,但是很热爱计算机,所以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()函数懵到了,或许是他太不耀眼了,看了很多书和视频都没有发现过他的存在,于是百度了一下,总结了一些大神经验,这里简洁介绍下

函数解释:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法
 
很简单,就是给指定内存段初始化。然后又在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;
}
 
Format()函数,百度了下,在百科里面的用法这里都不是,于是百度了下str.format()函数的用法,如下:
int转换为CString:
  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就可以了
 
这是MFC编程的代码,但是这个函数的功能也很明了了,就是一个类型转换功能的函数,并且可以自选长度,就先说到这,有不妥的请指正,
                                                                 初入门的编程小菜鸟一枚!!
 
 
原文地址:https://www.cnblogs.com/yican/p/3301382.html