zoukankan      html  css  js  c++  java
  • 成本与利润最大化问题

    资源分配问题的动态规划解法

    假设工程项目总数为 n,可利用的资源份额总数为 m,给每项工程投入的资
    源份额数不同时,所获得的利润也不同。要我们怎么分配资源以获取最大利润

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 50;
    int m, n;
    int G[maxn+1][maxn+1];
    // 需要两个记忆化数组
    int dp[maxn+1][maxn+1];  // 表示给前i个项目分配j个资源的最大利润
    int d[maxn+1][maxn+1];  // 表示使得dp[i][j]最大时,第i个项目分配的资源数
    
    void solve()
    {
        //初始化
        for(int i = 1; i <= m; ++i) {
            dp[1][i] = G[1][i];
            d[1][i] = i;
        }
    
        for(int i = 2; i <= n; ++i) {
            for(int j = 0; j <= m; ++j) {
                for(int k = 0; k <= j; ++k) {
                    int t = dp[i-1][k] + G[i][j-k];
                    if(dp[i][j] < t) {
                        dp[i][j] = t;
                        d[i][j] = j - k;
                    }
                }
            }
        }
        int cnt = m;
        for(int i = n; i >= 1; --i) {
            printf("the %d project allocate %d resources
    ", i, d[i][cnt]);
            cnt -= d[i][cnt];
        }
        cout << "The biggest profits: " << dp[n][m] << endl;
    }
    int main()
    {
        freopen("input.txt", "r", stdin);
        cin >> n >> m;
        // 利润表
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; ++j) {
                cin >> G[i][j];
            }
        }
        solve();
        return 0;
    }
    

    注:复试题

  • 相关阅读:
    连接mysql遇到的问题
    洛谷 P3369 【模板】普通平衡树(Treap/SBT)
    开博啦
    luogu【P2753】[USACO4.3]字母游戏Letter Game
    luogu【P3377】 【模板】左偏树
    POJ-2251
    HDU-1518
    Coderforces-455A
    UVA-1608
    Coderfocers-551C
  • 原文地址:https://www.cnblogs.com/codemeta-2020/p/14582961.html
Copyright © 2011-2022 走看看