- 自顶向下递归方法
//自顶向下递归
//钢条切割
#include <iostream>
#define N 1000
using namespace std;
int CUT_ROD(int p[],int n) //p数组为价格,n为钢条长度
{
int q=-1;
if(n == 0) return 0;
for(int i=1;i<=n;i++)
{
int temp;
temp=p[i]+CUT_ROD(p,n-i);
if(q < temp) q=temp;
}
return q;
}
int main(int argc, char *argv[])
{
int n; cin >> n;
int p[N];
for(int i=1;i<=n;i++) cin >> p[i];
cout << CUT_ROD(p,n) << endl;
cout << "Hello World!" << endl;
return 0;
}
2.自顶向下动态规划法
//动态规划法
//带备忘的自顶向下
//钢条切割
#include <iostream>
#define N 1000
using namespace std;
int MEM_CUT_ROD(int p[],int r[],int n)
{
int q=-1;
if(r[n]>=0) return r[n];
if(n == 0) q=0;
for(int i=1;i<=n;i++)
{
int temp;
temp=p[i]+MEM_CUT_ROD(p,r,n-i);
if(q < temp) q=temp;
}
r[n] = q;
return q;
}
int CUT_ROD(int p[],int n)
{
int r[N]; //备忘
for(int i=0;i<=n;i++) r[i]=-1;
return MEM_CUT_ROD(p,r,n);
}
int main(int argc, char *argv[])
{
int n; cin >> n;
int p[N];
for(int i=1;i <= n;i++) cin >> p[i];
cout << CUT_ROD(p,n) <<endl;
cout << "Hello World!" << endl;
return 0;
}
3.自底向上动态规划法
//动态规划法
//自底向上
//钢条切割
#include <iostream>
#include <cstring>
#define N 1000
using namespace std;
int CUT_ROD(int p[],int n)
{
int r[N];
memset(r,0,sizeof(r));
for(int j=1;j<=n;j++)
{
int q=-1;
for(int i=1;i<=j;i++)
{
int temp;
temp = p[i]+r[j-i];
if(q < temp) q=temp;
}
r[j] = q;
}
return r[n];
}
int main(int argc, char *argv[])
{
int n; cin >> n;
int p[N];
for(int i=1;i<=n;i++) cin >> p[i];
cout << CUT_ROD(p,n) << endl;
cout << "Hello World!" << endl;
return 0;
}
4.返回最优值和切割方案
//动态规划法
//钢条切割 返回最优值和切割方案
#include <iostream>
#include <cstring>
using namespace std;
int d[1000],s[1000];
CUT_ROD(int A[],int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(d[i] < d[i-j]+A[j])
{
d[i]=d[i-j]+A[j];
s[i]=j;
}
}
}
}
int main(int argc, char *argv[])
{
int A[1000];
int n; cin >> n;
memset(A,0,sizeof(A));
memset(d,0,sizeof(d));
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++) cin >> A[i];
int value; cin >> value;
CUT_ROD(A,value);
cout << d[value] << endl;
while(value > 0)
{
cout << s[value] << " " << A[s[value]] << endl;
value = value - s[value];
}
return 0;
}
5.每次切割需要付出固定成本c,返回最优值和切割方案
//动态规划法
//钢条切割 每次切割需要付出固定成本c
//返回最优值和切割方案
#include <iostream>
#include <cstring>
using namespace std;
int d[1000],s[1000];
CUT_ROD(int A[],int n,int c)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(d[i] < d[i-j]+A[j]-c)
{
d[i]=d[i-j]+A[j]-c;
s[i]=j;
}
}
}
}
int main(int argc, char *argv[])
{
int A[1000];
int n; cin >> n;
int c; cin >> c;
memset(A,0,sizeof(A));
memset(d,0,sizeof(d));
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++) cin >> A[i];
int value; cin >> value;
CUT_ROD(A,value,c);
cout << d[value] << endl;
while(value > 0)
{
cout << s[value] << " " << A[s[value]] << endl;
value = value - s[value];
}
return 0;
}