钢条切割:递归+记忆化
#include<iostream> #include<algorithm> using namespace std; /* 给出长度为i的钢条对应的出售价格为pi, 问题: 给定一段长度为n的钢条怎么切才会使收益最大; 技巧:对于大量重复的子问题,我们采取记忆化,这样相比于之前大大节省了时间 */ int p[100]={0,1,5,8,10,13,17,18,22,25,30}; int r[100]; void memoized(){ for(int i=0;i<=100;i++){ r[i]=-10000; } } int cut(int n){ int q=-10000; if(r[n]>0) return r[n]; if(n==0) q=0; else{ for(int i=1;i<=n;i++){ if((cut(n-i)+p[i])>q){ q=cut(n-i)+p[i]; } } r[n]=q; } return q; } int main() { int n; while(cin>>n){ cout<<cut(n)<<endl; } system("pause"); return 0; }