动态规划——钢条切割最优解算法

最优价格表动态规划——钢条切割最优解算法_第1张图片

钢条长度   1      2        3             4                     5             6                7               8                  9                10

钢条价格   1      5         8             9                    10           17               17             20                24               30

 

下面为计算当钢条长度为n时,最优的价格

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 钢条最优解算法
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 9; //钢条长度
            int[] p = { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 }; // 钢条长度对应的价格
            int[] res = new int[n+1];  //res为记录已算出当钢条长度为n时的最优解数组
            Console.WriteLine(Up(n,p,res));
            Console.WriteLine(BottomUp(n,p,res));
            Console.ReadKey();
        }

        //static int UpDown(int n , int[] p) //递归法
        //{
        //    if (n == 0) 
        //    {
        //        Console.WriteLine("n==0");
        //        return 0;
        //    }
        //    int tempPrice = 0;
        //    for (int i = 1; i < n + 1; i++)
        //    {
        //        int maxPrice = p[i] + UpDown(n-i,p);
        //        if (maxPrice > tempPrice)
        //        {
        //            tempPrice = maxPrice;
        //        }
        //    }
        //    return tempPrice;
        //}

        static int Up(int n , int[] p,int[] result) //自上向下(备忘录)
        {
            if (n == 0) return 0;
            if (result[n] != 0) return result[n];
            int tempPrice = 0;
            for (int i = 1; i < n + 1; i++)
            {
                int maxPrice = p[i] + Up(n - i, p,result);
                if (maxPrice > tempPrice)
                {
                    tempPrice = maxPrice;
                }
            }
            result[n] = tempPrice;
            return tempPrice;
        }

        static int BottomUp(int n , int[] p , int[] result) //自下向上(备忘录)
        {
            for (int i = 1; i < n+1; i++)
            {
                int tempPrice = 0;
                for (int j = 0; j <= i ; j++)
                {
                    int maxPrice = p[j] + result[i - j];
                    if (maxPrice > tempPrice)
                        tempPrice = maxPrice;
                }
                result[i] = tempPrice;
            }
            return result[n];
        }
    }
}

 

 

 

你可能感兴趣的:(C#数据结构)