UVA-10163 Storage Keepers (0-1背包)

本文介绍了一种解决最大最小安全系数问题的方法,该问题涉及在有限的应聘者中分配仓库的任务,目标是最大化最小的安全系数并同时计算能力值总和。文章通过动态规划算法给出了详细的实现步骤。

题目大意:有n个仓库,m个应聘者,每人对应一个能力值。一个人可以看多个仓库,一间仓库只能被一个人看。如果一个能力为p的人看k间仓库,那么安全系数为p/k,求出最大的最小安全系数,并且求出在此情况下所有人的能力值总和。

题目分析:这道题比较灵活,可以另仓库总数作为背包容量,也可以用应聘者总数作为背包容量。最后,求能力值总和时还需要再DP一次。

 

代码如下:

# include<iostream>
# include<cstring>
# include<cstdio>
# include<algorithm>
using namespace std;

const int INF=1000000000;

int n,m,p[35];
int dp[105][35];

int main()
{
    while(scanf("%d%d",&n,&m)&&n+m)
    {
        for(int i=1;i<=m;++i)
            scanf("%d",p+i);

        memset(dp,0,sizeof(dp));
        for(int i=0;i<=m;++i) dp[0][i]=INF;
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                dp[i][j]=dp[i][j-1];
                for(int k=1;k<=i;++k)
                    dp[i][j]=max(min(dp[i-k][j-1],p[j]/k),dp[i][j]);
            }
        }
        printf("%d ",dp[n][m]);
        int ans1=dp[n][m];
        if(ans1==0){
            printf("0\n");
            continue;
        }

        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;++i) dp[i][0]=INF;
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                dp[i][j]=dp[i][j-1];
                for(int k=1;k<=i;++k)
                    if(p[j]/k>=ans1)
                        dp[i][j]=min(dp[i][j],dp[i-k][j-1]+p[j]);
            }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/20143605--pcx/p/5202140.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值