| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1848 人关注过本帖, 1 人收藏
标题:一道经典的动态规划题目的思考
只看楼主 加入收藏
jerrymu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-11-17
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:2 
一道经典的动态规划题目的思考
遇到棘手的问题请教:  Cutting stick problem

问题描述:切割一条木棍,在不同处(cutting points)切,会造成不同的开销(cost)。
例子: 考虑一根长10米的木棍,在距离头2,4,7米处切,我们有几种不同的选择。
如果按次序先后在 2,4,最后7米处切。会导致花费为10,8,6,一共24. 解释:
木棍最初长10(即为最初的开销),在2切之后,剩8,(此为余下开销),最后在7米处切。
后者按次序先后在4,2,7处切,会产生花费10,4,6.共20.此次序好于第一种。

问题是找出一种递归的方法求出最小开销。

网上有位同学的解答,可以求出最小开销, 如下链接
http://blog.

我还想求出对应的切割顺序。如何在此题的基础上,记录并求出对应的最佳切割点。
比如

Input:
10
3
2 4 7
Output:
The minimum cutting is 20.
还要输出:
The optimal cutting sequence: 4,2,7

算法是递归求解,如何能记录这些对应的切割点呢。。。?
初学动态规划,希望有同学指点!

谢谢大家了!!
搜索更多相关主题的帖子: 动态规划 经典 思考 
2010-11-17 15:00
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
#include <stdio.h>
#include <math.h>

int sum = 0;
int length = 10; //表示木棍的长度[0  10]
int num = 4;//表示要分的点的个数
int a[] = {2, 6, 7, 8};//分点出的值

int search_mid(int low, int high)
{
    int k = high;
    for( int i=0; i<num; ++i )
    {
        if( low<a[i] && a[i]<high )
        {
            if( abs(k-(low+high)/2) > abs(a[i] -(low+high)/2) )
                k = a[i];
        }
    }
    return k;
}

void cut(int low, int high)
{
    int i = search_mid(low, high);
    if( i == high )
    {
        return;
    }
    sum = sum+high-low;
    printf("%d ", i);
    cut(low, i);
    cut(i, high);
}

int main()
{
    cut(0, 10);
    printf("\n");
    printf("%d\n", sum);
    return 0;
}
2010-11-23 12:48
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2010-11-23 12:52
快速回复:一道经典的动态规划题目的思考
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025262 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved