当前位置:嗨网首页>书籍在线阅读

26-实战演练

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.5.5 实战演练

//program 4-3
#include<iostream>
using namespace std;
const int ms = 1000;
int r[ms][ms],m[ms][ms],s[ms][ms];    //i到j站的租金
int n;            //共有n个站点
void rent()
{
     int i,j,k,d;
     for(d=3;d<=n;d++) //将问题分为小规模为d
     {
         for(i=1;i<=n-d+1;i++)
              {
                   j=i+d-1;
                   for(k=i+1;k<j;k++)  //记录每一个小规模内的最优解
                   {
                        int temp;
                        temp=m[i][k]+m[k][j];
                        if(temp<m[i][j])
                             {
                                m[i][j]=temp;
                                s[i][j]=k;
                             }
                   }
              }
     }
}
void print(int i,int j)
{
     if(s[i][j]==0 )
     {
         cout << "--"<<j;
         return ;
     }
     print(i,s[i][j]);
     print(s[i][j],j);
}
int main()
{
     int i,j;
     cout << "请输入站点的个数 n:";
     cin >> n;
     cout << "请依次输入各站点之间的租金:";
     for(i=1;i<=n;i++)
          for(j=i+1;j<=n;++j)
          {
              cin>>r[i][j];
              m[i][j]=r[i][j];
          }
     rent();
     cout << "花费的最少租金为:" <<m[1][n] << endl;
     cout <<"最少租金经过的站点:"<<1;
     print(1,n);
     return 0;
}

算法实现和测试

(1)运行环境

Code::Blocks

Visual C++ 6.0

(2)输入

请输入站点的个数n:6
请依次输入各站点之间的租金:2 6 9 15 20 3 5 11 18 3 6 12 5 8 6

(3)输出

花费的最少租金为:15
最少租金经过的站点:1--2--4--6