【洛谷2066】机器分配

思路:

f[i][j]表示i个公司分配j台机器能得到的最大收益

c[i][j]表示i个公司分配j台机器能得到的最大收益

这样就可以从上往下推

第三重循环控制变量k为前i-1个公司分配的机器数,

那么显然第i各公司能分到j-k台机器

转移:f[i][j]=max(f[i][j],f[i-1][k]+c[i][j-k])

 

关于输出第几个公司分几台机器,

我们发现在动规里很难记录状态,所以采取递归搜索的方式

从最后的答案向前倒推,如果此时的答案与当前最后一个答案相同,就说明找到了曾经的一个解……

这个不是很好解释,可以看下代码

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int c[11][16],f[11][16],maxl;
 5 int max(int,int);
 6 void find(int,int);
 7 int main(){
 8     int n,m;
 9     scanf("%d %d",&n,&m);
10     for (int i=1;i<=n;i++)
11         for (int j=1;j<=m;j++)
12             scanf("%d",&c[i][j]);
13     for (int i=1;i<=n;i++)
14         for (int j=1;j<=m;j++)
15             for (int k=0;k<=j;k++)
16                 f[i][j]=max(f[i][j],f[i-1][k]+c[i][j-k]);
17     printf("%d\n",f[n][m]);
18     maxl=f[n][m];
19     find(n,m);
20     return 0;
21 }
22 int max(int x,int y){
23     return x>y?x:y;
24 }
25 void find(int i,int j){
26     if (i==0) return;
27     for (int k=0;k<=j;k++)
28         if (maxl==f[i-1][k]+c[i][j-k]){
29             maxl=f[i-1][k];
30             find(i-1,k);
31             printf("%d %d\n",i,j-k);
32             break;
33         }
34 }
STD

 

转载于:https://www.cnblogs.com/Absolute-Zero/p/5852336.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值