Problem
给定一段长度为n英寸的钢条和一个价格表
pi(i=1,2....)
,求钢条切割方案使销售收益
rn
最大。注意:切割没有成本,若长度为
n
英寸的钢条价格
solution
对于
rn(n>=1)
,总可以用更短的钢条的最优收益切割来描述它:
rn=max(pn,r1+r(n−1),r2+r(n−2)....)
pn 表示不切割,其他n-1个参数对应另外n-1中方案:对每一 i=1,2,...n−1 ,首先将钢条切割为长度为 i 和
此题可对应为用数量为m的钱必须用完对应的最大价值,每种商品可重复购买
01背包问题及其变种对用数量为m的钱不一定用完对应的最大价值
Source code
#include <iostream>
using namespace std;
int max(int a, int b)
{
if (a > b)
return a;
return b;
}
int main()
{
int p[11] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 };//价格表,位置对应长度
int length;
cin >> length;
int *r = (int *)malloc(sizeof(int)*(length + 1));
r[0] = 0;
for (int i = 1; i <= length; i++)
{
int q;
if (i <= 10)
q = p[i];//不切割
else
q = -1;//必须切割
for (int j = 1; j <= i/2; j++)
q = max(q, r[j] + r[i - j]);
r[i] = q;
}
cout << r[length] << endl;
free(r);
return 0;
}