我希望在杆头问题上获得最大收益的杆尺寸。 假设有4个长度的杆。
1 = 5
2 = 4
3 = 3
4 = 10
在这种情况下,最大收入将产生1,1,1,1,即20。 我获得了最大的收入,但我如何获得杆尺寸 这是代码。
#include<iostream>
using namespace std;
int Rod_Cut(int *,int);
int main()
{
const int n=5;
int arr[n]={0,5,4,3,10};
int size[n]={0};
cout<<Rod_Cut(arr,n)<<endl;
}
int Rod_Cut(int *arr, int n)
{
if(n==0)
{
return 0;
}
int q=0;
for(int i=1;i<n;i++)
{
q=max(q,arr[i]+Rod_Cut(arr,n-i));
}
return q;
}
答案 0 :(得分:1)
这是一种方法:
您需要返回每次计算中使用的序列。如果新值优于目前的值,则必须保存新的&#34; best&#34;序列。最后,您将返回找到的最佳序列。
该提案不是最佳的(例如性能),但它可能会给你一些想法。然后,您可以优化代码以更好地执行。
祝你好运。int Rod_Cut(int *,int, vector<int>&);
int main()
{
const int n=5;
int arr[n]={0,5,8,3,10};
int size[n]={0};
vector<int> v; // Create vector for the best sequence
cout<<Rod_Cut(arr,n,v)<<endl;
// Print the best sequence
for(auto e : v)
{
cout << e << " ";
}
}
int Rod_Cut(int *arr, int n, vector<int>& v)
{
if(n==0)
{
return 0;
}
int q=0;
vector<int> t; // Temp vector for next call
vector<int> st; // The best sequence found at this level
for(int i=1;i<n;i++)
{
int temp = arr[i]+Rod_Cut(arr,n-i,t);
if (temp > q)
{
// A new better sequence has been found
st.clear(); // clear the former best sequence
for(auto e : t) // add the new best sequence
{
st.push_back(e);
}
st.push_back(i); // add i used at this level
q = temp;
}
t.clear(); // Prepare for next call
}
// Copy the best sequence to the returned vector
for (auto e : st)
{
v.push_back(e);
}
return q;
}