求钢筋切割问题,最大价值

自底向上法:这种方法一般需要恰当定义子问题“规模”的概念,使得任何子问题的求解都依赖于“更小的”子问题的求解。因而我们可以将子问题按规模排序,按由小至大的顺序进行求解。当求解某个子问题时,它所依赖的那些更小的子问题都已经求解完毕,结果已经保存。每个子问题只需要求解一次,当我们求解它(也是第一次遇到它)时,它的所有前提子问题都已求解完成。

问题:公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。

假定我们知道公司出售一段长度i英寸的钢条的价格为pi(i=1,2,...,单位为美元)。钢条的长度均为整英寸。图给出了一个价格表的样例。

(借用了图)

//Rn = max{pn,R1+Rn-1,R2+Rn-2,...}
//简化版本 Rn = max(Pi+Rn-i),1<=i<=n

自底向上的伪代码:

BOTTOM-UP-CUT-ROD(p,n)
1   let r[0..n]be a new array
2   r[0]=0
3   for j=1 to n
4      q=-1
5      for i=1 to j
6         q=max(q,p[i]+r[j-i])
7      r[j]=q
8   return r[n]

// Gangjinqiege.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <IOSTREAM>
#include <VECTOR>
using namespace std;
//Rn = max{pn,R1+Rn-1,R2+Rn-2,...}
//简化版本 Rn = max(Pi+Rn-i),1<=i<=n
//1,5,8,9,10,17,17,20,24,30
//1,2,3,4,5 ,6 ,7 ,8 ,9 ,10
int max(int a,int b){
return a>b?a:b;
}
//p只有10个元素,切割的钢条总长度需<=10
int p[10] = {1,5,8,9,10,17,17,20,24,30};
int getMaxValue(int n){
vector<int> array(n+1,0);
// array.resize(n+1);
int i = 0,j = 0;
for(i = 1;i<n+1;i++){


int q = 0;
for(j = 1;j<=i;j++){
q = max(q,p[j-1] + array[i-j]);
}

array[i] = q;
// cout<<q<<" ";
}
// cout<<endl;
//array[1] = max{p[0]+array[0]}
//array[2] = max{p[0]+array[1],p[1]+array[0]}
//array[3] = max{p[0]+array[2],p[1]+array[1],p[2]+array[0]}

// for( i = 0;i<n+1;i++)
// cout<<array[i]<<" ";
cout<<endl;
return array[n];
}
int main(int argc, char* argv[])
{
for(int i = 1;i<11;i++)
cout<<"i = "<<i<<" value = "<<getMaxValue(i)<<endl;
return 0;
}

 
时间: 2024-12-07 09:31:15

求钢筋切割问题,最大价值的相关文章

HDU 5984(求木棒切割期望 数学)

题意是给定一长为 L 的木棒,每次任意切去一部分直到剩余部分的长度不超过 D,求切割次数的期望. 若木棒初始长度不超过 D,则期望是 0.000000: 设切割长度为 X 的木棒切割次数的期望是 F(X). 则 F(X) = F(切割点位置为 0 ~ D) + F(切割点位置为 D ~ X ) + 1:(此处的 +1 是指首次切割产生的次数) 而 F(切割点位置为 0 ~ D ) = 0:(因为已无需再切割) 令下一次切割点的位置为 T, F(切割点位置为 D ~ X ) = 在D~X上积分 (

动态规划 -- 钢条切割

/* 动态规划和分治法相似,都是通过组合子问题的解来求解原问题. 但分治法是将 问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出 原问题的解.与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的 子问题.在这种情况下,分治法会做很多不必要的工作. 动态规划方法通常用来求解最优化问题,这类问题通常有很多可行解.我们希望寻找 具有最优值的解. 我们通常按照如下4个步骤来设计一个动态规划算法: · 刻画一个最优解的结构特征 · 递归地定义最优解的值 · 计算最优解

SDUT2826:名字的价值

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2806 名字的价值 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 每 个人都有名字,名字都是唯一的不存在重复现象.现在假设名字都是由小写字母组成并且长度不超过10,我们赋予每个名字一个初始价值.价值是正整数并且不超 过100,如果第j个人的名字是第i个人的前缀并且前缀长度最大,我们就

区间的价值(线段树)百度之星

区间的价值 Accepts: 0 Submissions: 0 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 我们定义“区间的价值”为一段区间的最大值*最小值. 一个区间左端点在LLL,右端点在RRR,那么该区间的长度为(R−L+1)(R-L+1)(R−L+1). 现在聪明的杰西想要知道,对于长度为kkk的区间,最大价值的区间价值是多少.

【算法导论】动态规划之“钢管切割”问题

动态规划,其实跟分治法有些相似,基本思想都是将复杂的问题分成数个简单的子问题,然后再去解决.它们的区别在于,分治法关注的子问题不相互"重叠",而动态规划关注的子问题,多是相互"重叠"的.比如在快速排序中,我们将数据分成两部分,这两部分再分别快速排序的递归思想,也就是将整个问题的排序划分为子问题子数组的排序,但是这两个子数组的排序之间并没有相互联系,a子数组的排序不会因为b子数组的排序而得到任何"好处"或者"坏处".但是有些时候

17-又见01背包

/*                                        又见01背包时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述        有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W     的物品,求所有挑选方案中物品价值总和的最大值.    1 <= n <=100    1 <= wi <= 10^7    1 <= vi <= 100    1 <= W <= 10^

超大背包(挑战编程之01背包)

先来温习01背包: 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2--Wn,与之相对应的价值为P1,P2--Pn. 求出获得最大价值的方案. 注意:在本题中,所有的体积值均为整数. 思路: 考虑用动态规划的方法来解决,这里的:阶段是:在前N件物品中,选取若干件物品放入背包中:状态是:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值:决策是:第N件物品放或者不放:由此可以写出动态转移方程:我们用f[i,j]表示在前 i 件物品中选择若干件放

正益移动:不仅仅送给你软件生产线

编者按:刚挂牌上市的正益移动,其商业模式对中国B2D2B市场具有标杆意义,从而也就有了剖析的价值."从整体来说,2D必然是赚不了钱的".没错,D(开发者)们多半不会为了基本的开发工具付钱.但是,如果这些工具及其方法能够便利和强劲到改变他们的工作方式的地步,那么他们一定会以BYOX(带着自己的工具.方法.习惯)的方式进入B(企业)中,并且与企业配置的相应生产线和作业系统协同工作.而正益移动正是向D们免费提供工具和培训,为企业配置2D的生产线和作业系统的2D服务商.从而实现了从2D经由BY

2017多校Round4(hdu6067~hdu6079)

补题进度:10/13 1001 待填坑 1002(kmp+递推) 题意: 有长度为n(<=50000)的字符串S和长度为m(m<=100)的字符串T,有k(k<=50000)组询问,每个询问(L,R),表示对于所有的(i,j)(1<=i<=L,R<=j<=n),将S[1..i]和S[j..n]拼接起来,求这个新的S'中出现T的次数总和 分析: 我们分析对于一个(i,j)的情况下,那么T的出现有三种情况,一种是整体在[1..i],第二种是整体在[j..n],第三种是