【发布时间】:2015-06-03 12:45:48
【问题描述】:
我有一条丝带,它的长度是 n。我想以满足以下两个条件的方式剪彩:
1. After the cutting each ribbon piece should have length a, b or c.
2. After the cutting the number of ribbon pieces should be maximum.
求出所需切割后的最大件数。
输入格式为n,a,b,c,其中n 是色带的原始长度,a、b、c 是所需的色带长度。
For eg: I/P = 5 5 3 2
O/P = 2
现在,我能够意识到这应该遵循 DP 解决方案。一维 DP,其中 dp[n] 表示长度为 n 的色带的最大路数。
现在,我不确定递归关系是否是这种形式,
dp[n] = dp[n-a] + a;
dp[n] = dp[n-b] + b;
dp[n] = dp[n-c] + c;
这是正确的还是有其他方法?
编辑:根据第一篇文章实现:
#include <iostream>
#include <cmath>
using namespace std;
int dp[100000];
int maxi (int a,int b,int c);
int main (void)
{
int n,a,b,c;
cin>>n>>a>>b>>c;
for (int i = 0; i <= n; i++)
{
if ( i == 0 )
dp[i] = 0;
else
dp[i] = maxi(dp[i-a],dp[i-b],dp[i-c])+1;
}
cout<<dp[n]<<"\n";
return 0;
}
int maxi (int a,int b,int c)
{
int ret;
if ( a > b )
ret = a;
else
ret = b;
if ( ret < c )
ret = c;
return ret;
}
【问题讨论】:
-
不,不正确。如何为 dp[n] 分配三个不同的值?
-
找到 min(a,b,c) 并切割所有相同长度的部分?
-
不能是
dp[n] = dp[n-a] + dp[n-b] + dp[n-c] + 3之类的吗? (我可能肯定是错的,但只是问)。 -
@zubergu,我想到了。但是假设色带长度为
5和min = 2,其中a=2, b=3, c=4切割后,我们将得到长度为2 2 1的片段。但是1作为长度是不可接受的。因此我们不能这样做。 -
你越来越近了,但事实并非如此。你也许可以想想你给出的例子:dp[1] = 0, dp[2] = 1, dp[3] = 1, 你将如何计算 dp[5] ?
标签: algorithm