P2066 机器分配

来源:互联网 发布:网络安全策略模型 编辑:程序博客网 时间:2024/05/18 03:00

传送门
dp[i][j]表示第i个公司用了j台最大的价值。
i-1的已知
dp[i][j]=max(dp[i-1][k]+map[i][m-k]).
问题是咋输出,跟上面的方式一样,去找能求出最大值的,递归输出即可。

#include <cstdio>#include <iostream>using namespace std;int map[30][30];int dp[30][30];void print(int x,int y,int max1){    if(x==0) return;    for(int j=0;j<=y;j++)     if(max1==(dp[x-1][j]+map[x][y-j]))      {        print(x-1,j,dp[x-1][j]);        printf("%d %d\n",x,y-j);        break;      }}int main(){    int n,m;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)     for(int j=1;j<=m;j++)      scanf("%d",&map[i][j]);    for(int i=1;i<=n;i++)     for(int j=0;j<=m;j++)     {        int maxm=0;        for(int k=0;k<=j;k++)         maxm=max(maxm,dp[i-1][k]+map[i][j-k]);        dp[i][j]=maxm;     }    printf("%d\n",dp[n][m]);    print(n,m,dp[n][m]);}