如何最大化给定长度n的色带的色带片数?

时间:2015-06-03 12:45:49

标签: algorithm

我有一条缎带,它的长度是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;
}

2 个答案:

答案 0 :(得分:3)

if n < 0:
    dp[n] = -infinity
if n == 0:
    dp[n] = 0
if n > 0:
    dp[n] = 1 + max(dp[n-a], dp[n-b], dp[n-c])

答案 1 :(得分:0)

for (int i = 0; i <= n; i++)
    {
        if (i == 0)
            dp[i] = 0;
        else {
            int A = (i-a>=0) ? dp[i-a] : -n-1;
            int B = (i-b>=0) ? dp[i-b] : -n-1;
            int C = (i-c>=0) ? dp[i-c] : -n-1;
            dp[i] = maxi(A,B,C)+1;
        }
    }