如何动态思考这个任务?

时间:2015-08-14 07:03:19

标签: c++ dynamic-programming

我认为这个问题是以表格方式思考的一个很好的初学者问题。我想我已经设法得到了要点,但仍然不是很清楚。我的代码似乎没有做到这一点。这是question

问题是最大化件数,使总长度等于N.

Sample input:
5(total length) 5 3 2(individual pieces length)
output:
The answer could be 1(if you select 5) or 2(in the case of 3+2)

经过一番思考后我想出了这个:

#include<iostream>
#include<algorithm>
using namespace std;


int main()
{
    int total_length, individual_lengths[3];
    cin >> total_length;
    for(int i=1;i<=3;i++)
        cin >> individual_lengths[i];


    int dp[total_length+1];
    dp[0]=0;

    for(int i=1;i<=total_length;i++)
    {
        for(int k=1;k<=3;k++)
            if(individual_lengths[k]<=i)
                dp[i]=max(dp[i-1], dp[i-individual_lengths[k]]+1);
    }
    cout << dp[total_length];
}

dp 功能初始化:让dp[i]为功能区长度i的总件数

dp 基本情况:如果i为零,则dp [0](长度为零时的总件数)将为0.因此,dp[0] = 0 < / p>

递归关系:如果当前篇幅为a[k](1<=k<=3) <= total_length being considereddp[i] = max(dp[i-1], dp[i-a[k]] + 1)

我的思维流程是否正确?任何改进的建议(可能限于动态编程方法,而不是暴力)都会有所帮助。

1 个答案:

答案 0 :(得分:1)

编辑**

假设len = 13,a = 2,b = 4,c = 5.

for(int i=1;i<=len;i++)
{
    for(int k=1;k<=3;k++)
        if(a[k]<=i)
            dp[i]=max(dp[i-1], dp[i-a[k]]+1);
}
//i=1,k=1,2,3->skip
//i=2,k=1->dp[2]=max(dp[i-1],dp[i-a[k]+1])
//here is an issue!  dp[i-1] or dp[2-1] has not been assigned!

//so lets try if all dp values are initialized as 0, continueing from before
//i=2,k=1->dp[2]=max(0,0) //because dp[/*i-1*//*2-1*/1] = 0, and dp[/*1+i-a[k]*//*1+2-a[1]*//*3-2*/1] = 0
//i=2,k=2,3->skip
//i=3,k=1->.......
基本上,从我所知道的,你只是在比较0&#39; s。 ** 我会做的

int count = static_cast<int>(len/a);
len%=a;
for (int sum = count*a; sum != len; sum-=a)
{
   if (!(sum+c<len || sum+b<len))
      count--;
   sum+=sum+c<len?c:sum+b<len?b:0;
}