我认为这个问题是以表格方式思考的一个很好的初学者问题。我想我已经设法得到了要点,但仍然不是很清楚。我的代码似乎没有做到这一点。这是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 considered
,dp[i] = max(dp[i-1], dp[i-a[k]] + 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;
}