1.钢条切割问题
#include<bits/stdc++.h>
using namespace std;
const int eps=10e-9;
int p1[11]={0,1,5,8,9,10,17,17,20,24,30};
int q[10010];
//递归求解钢条切割
int cut_rod(int *a,int n)
{
if(n==0)
{
return 0;
}
int q=eps;
for(int i=1;i<=n;i++)
{
q=max(q,a[i]+cut_rod(a,n-i));
}
return q;
}
//优化1:记忆化
int memoized_cut_rod_aux(int *a,int n,int *b)
{
if(b[n]>0)
{
return b[n];
}
else
{
for(int i=1;i<=n;i++)
{
b[i]=max(b[i],a[i]+memoized_cut_rod_aux(a,n-i,b));
}
}
return b[n];
}
//优化2:动态规划
int botttom_up_cut_rod(int *a,int n)
{
for(int i=1;i<=n;i++)
{
int q1=eps;
for(int j=1;j<=i;j++)
{
q1=max(q1,a[j]+q[i-j]);
}
q[i]=q1;
}
return q[n];
}
int main()
{
fill(q,q+10010,0);
int n;
cin>>n;
//cout<<cut_rod(p1,n);
cout<<memoized_cut_rod_aux(p1,n,q);
//cout<<botttom_up_cut_rod(p1,n);
return 0;
}