【DP 训练】Storage Keepers, UVa10163

来源:互联网 发布:pfordelta算法 编辑:程序博客网 时间:2024/05/16 11:14
#include<bits/stdc++.h>using namespace std;#define maxn 110#define INF 0x3f3f3f3fint n,m;int p[40];int f[40][maxn],g[40][maxn];//status:考虑到第i个人,分配了j个仓库的解 int main(){while(scanf("%d%d",&n,&m)==2&&(n||m)){for(int i=1;i<=m;i++)scanf("%d",&p[i]);memset(f,0,sizeof(f));for(int i=1;i<=m;i++)//枚举人 {f[i-1][0] = INF;for(int j=1;j<=n;j++)//枚举仓库 {f[i][j] = f[i-1][j];for(int k=1;k<=j;k++)//枚举分配 {f[i][j] = max(f[i][j],min(f[i-1][j-k],p[i]/k));//最小值最大 }}}memset(g,0x3f,sizeof(g));for(int i=1;i<=m;i++){g[i-1][0] = 0;for(int j=1;j<=n;j++){g[i][j] = g[i-1][j];for(int k=1;k<=j;k++){int s = p[i]/k;//当前已经到达最优解 if(s>=f[m][n]){//更改能力值 这里>= 如果是==就要WAg[i][j] = min(g[i][j],g[i-1][j-k]+p[i]);}}}}printf("%d %d\n",f[m][n],f[m][n]==0?0:g[m][n]);}return 0;}

0 0
原创粉丝点击