【发布时间】:2020-12-11 15:28:57
【问题描述】:
**给定一个整数 N 表示线段的长度。您需要以这样一种方式切割线段,即每次线段的切割长度都是整数 x , y 或 z。并且在执行所有切割操作之后,切割段的总数必须是最大的。 **
#include<bits/stdc++.h>
using namespace std;
int findMaxSegments(int a[],int target,int n,int count)
{
if(n == 0 && target > 0)
return 0;
if(target == 0)
return count;
if(a[n-1] <= target)
return max(findMaxSegments(a,target-a[n-1],n,count+1),findMaxSegments(a,target,n-1,count));
else
return findMaxSegments(a,target,n-1,count);
}
int main()
{
//code
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int queries;
cin>>queries;
while(queries--)
{
int sum;
cin>>sum;
int arr[3];
for(int i=0;i<3;i++)
cin>>arr[i];
int count = findMaxSegments(arr,sum,3,0);
cout<<count<<"\n";
}
return 0;
}
以上是递归解决方案,它运行完美但需要更多时间,谁能帮我将上面的代码更改为记忆化或自上而下的 dp?
你可以检查一下代码
INPUT- query->1
N->2683
x,y,z->83 26 2709
OUTPUT 101
【问题讨论】:
-
您正在优化
max(a + b + c)与a*x + b*y + c*z = N、a >= 0、b >= 0、c >= 0和a, b, c in IN。我认为这是一个数学问题而不是编程问题:en.wikipedia.org/wiki/Integer_programming(好吧,在英语中它被称为整数编程)
标签: c++ algorithm recursion dynamic-programming memoization