double material = 6.3;
double size[3] = {0.5, 1, 2};
pair<int, double> dp[100][100][100];pair<int, double> get(pair<int, double>& p, int id)
{
    if (size[id] > p.second)
        return (make_pair(p.first+1, material - size[id]));
    return (make_pair(p.first, p.second - size[id]));
}pair<int, double> minp(pair<int, double>& p1, pair<int, double>& p2)
{
    if (p1.first < p2.first) return p1;
    if (p1.first == p2.first)
    {
        if (p1.second > p2.second) return p1;
    }
    return p2;
}pair<int, double> go(int n1, int n2, int n3)
{
    if (dp[n1][n2][n3].first != -1) return dp[n1][n2][n3];    pair<int, double> p1, np1, p2, np2, p3, np3;
    np1.first = np2.first = np3.first = INT_MAX;
    if (n1 > 0) 
    {
        p1 = go(n1-1, n2, n3);
        np1 = get(p1, 0);
    }
    if (n2 > 0) 
    {
        p2 = go(n1, n2-1, n3);
        np2 = get(p2, 1);
    }
    if (n3 > 0) 
    {
        p3 = go(n1, n2, n3-1);
        np3 = get(p3, 2);
    }    pair<int, double> min0 = minp(minp(np1, np2), np3);
    dp[n1][n2][n3] = min0;    return min0;
}void cal()
{
    for (int i = 0; i < 100; i++)
        for (int j = 0; j < 100; j++)
            for (int k = 0; k < 100; k++)
                dp[i][j][k] = make_pair(-1, 0);    dp[0][0][0].first = 0;
    dp[0][0][0].second = 0;    go(10, 20, 30);    cout << go(10, 20, 30).first << endl;
}

解决方案 »

  1.   

    因为不知道你所用的Pair,就用了系统类库KeyValuePair(它的Key,Value对应first和second,不过
    它们只读)
    代码如下namespace Program
    {
        public class Translate
        {
            private double material = 6.3;
            private double[] size = new double[]{0.5, 1, 2};
            private KeyValuePair<int, double>[][][] dp = new KeyValuePair<int,double>[100][][];        public KeyValuePair<int, double> Get(KeyValuePair<int, double> p, int id)
            {
                if (size[id] > p.Value)
                    return (new KeyValuePair<int, double>(p.Key + 1, material - size[id]));
                return (new KeyValuePair<int, double>(p.Key, p.Value - size[id])); 
            }        public KeyValuePair<int, double> MinP(KeyValuePair<int, double> p1, KeyValuePair<int, double> p2)
            {
                if (p1.Key < p2.Key)
                    return p1;
                if (p1.Key == p2.Key)
                {
                    if (p1.Value > p2.Value)
                        return p1;
                }
                return p2;
            }        public KeyValuePair<int, double> Go(int n1, int n2, int n3)
            {
                if (dp[n1][n2][n3].Key != -1) return dp[n1][n2][n3];            KeyValuePair<int, double> p1 = new KeyValuePair<int, double>();
                KeyValuePair<int, double> np1 = new KeyValuePair<int, double>(Int32.MaxValue, 0);
                KeyValuePair<int, double> p2 = new KeyValuePair<int, double>();
                KeyValuePair<int, double> np2 = new KeyValuePair<int, double>(Int32.MaxValue, 0);
                KeyValuePair<int, double> p3 = new KeyValuePair<int, double>();
                KeyValuePair<int, double> np3 = new KeyValuePair<int, double>(Int32.MaxValue, 0);
                
                if (n1 > 0)
                {
                    p1 = Go(n1 - 1, n2, n3);
                    np1 = Get(p1, 0);
                }
                if (n2 > 0)
                {
                    p2 = Go(n1, n2 - 1, n3);
                    np2 = Get(p2, 1);
                }
                if (n3 > 0)
                {
                    p3 = Go(n1, n2, n3 - 1);
                    np3 = Get(p3, 2);
                }            KeyValuePair<int, double> min0 = MinP(MinP(np1, np2), np3);
                dp[n1][n2][n3] = min0;
                return min0; 
            }        public void Cal()
            {
                for (int i = 0; i < 100; i++)
                {
                    dp[i] = new KeyValuePair<int, double>[100][];
                    for (int j = 0; j < 100; j++)
                    {
                        dp[i][j] = new KeyValuePair<int, double>[100];
                        for (int k = 0; k < 100; k++)
                            dp[i][j][k] = new KeyValuePair<int, double>(-1, 0);
                    }
                }            dp[0][0][0] = new KeyValuePair<int, double>(0, 0);
                Go(10, 20, 30);
                System.Console.WriteLine(Go(10, 20, 30).Key);
            }        static void Main(string[] args)
            {
                Translate t;
                t.Cal();
            }
        }
    }