zoukankan      html  css  js  c++  java
  • 机器分配

    传送门

    dp题

    因为想要得到n个分公司分配m个设备时的最有解

    所以我们定义数组f[i][j] 表示前i个公司分配j台机器时的最优

    接下来考虑转移

    因为前i家公司只会受到前i-1家的影响

    所以转移就是

    f[i][j]=max(f[i][j],f[i-1][j-k]+a[i][k])

    如何得到第i家公司的机器数呢?

    我们考虑根据答案倒推

    具体看代码

    //机器分配 
    #include<bits/stdc++.h>
    using namespace std;
    int f[20][20],a[20][20],maxx;
    int print(int i,int j){
        if(i==0) return 0;
        for(int k=0;k<=j;k++){
            if(maxx==f[i-1][k]+a[i][j-k]){
                maxx=f[i-1][k];
                print(i-1,k);
                printf("%d %d
    ",i,j-k);
                break;
            } 
        } 
    }
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                maxx=0;
                for(int k=0;k<=j;k++){
                    f[i][j]=max(f[i][j],f[i-1][j-k]+a[i][k]);
                }
                
            }
        }
        printf("%d
    ",f[n][m]);
        maxx=f[n][m];
        print(n,m);
        return 0;
    }
  • 相关阅读:
    luogu P1451 求细胞数量
    P1443 马的遍历
    luogu P1194 买礼物
    codevs 4919 线段树练习4
    printf的实型
    printf的整型
    scanf
    printf
    c++常用函数
    字符类型C++(ascll码表)
  • 原文地址:https://www.cnblogs.com/duojiaming/p/11687054.html
Copyright © 2011-2022 走看看