杭电 1171 Big Event in HDU(606比赛选拔 2017-08-20)(1003)

该博客详细介绍了如何将杭电1171题,即一个涉及设施平分的问题,转化为01背包问题进行求解。通过将每个物品视为独立个体,即使存在重复价值的物品,也能确保平分的公平性。输入包含多个测试案例,每个案例包括设施的种类、价值和数量。输出要求两院的价值尽可能相等且不小于软件学院。这是一个涉及数值计算和背包问题转换的ACM竞赛题目。
摘要由CSDN通过智能技术生成

可转化成01背包问题.

虽然有重复的物品,但可以把每个物品看做是一个独立的个体。这样就相当于把混合背包问题转化成01背包。背包的容量就是{(总价值)/2}.


问题描述
如今,我们都知道,计算机学院是杭州电子科技大学最大的部门。但是,也许你不知道,计算机学院曾经被拆分为计算机学院和软件学院。
分裂绝对是在杭州电子科技大学的一个大事件!同时,它是一个麻烦的事情。所有的设施必须平分。首先,所有设施进行评估,和两个设施被认为是相同的如果他们有相同的价值。假定有n(0<n<1000)各类设施(不同的价值、不同种类)。
输入
输入包含多个测试案例。每个测试案例,从一个数n(0<n<=50——不同设施的总数)。接下来的n行包含一个整数v(0 < v = 50 -设备的值)和一个整数m(0 < < = 100—相应的设施数量)。你可以认为所有V是不同的。
一个测试用例,从一个负整数终止输入和测试案例是不能处理。
输出
对于每一种情况,打印一行包含两个整数a和b表示计算机学院和软件学院的价值分别。A和B应尽可能相等。同时,你要保证不小于B。



Sample Input
  
  
2 10 1 20 1 3 10 1 20 2 30 1 -1
 

Sample Output
  
  
20 10 40 40

#include<cstdio>
#include<cstring>
#define mmax(a,b) a>b?a:b
int f[5000];
int dp[255555];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF,n>0){
        memset(f,0,sizeof(f));
        memset(dp,0,sizeof(dp));
        int number,value;
        int i,j,l=0;
        int sum=0;
        for(i=0;i<n;i++){
            scanf("%d%d",&value,&number);
            for(j=0;j<number;j++){
                f[l++]=value;
                sum+=value;
            }

        }
        for(i=0;i<l;i++){
            for(j=sum/2;j>=f[i];j--){
                dp[j]=mmax(dp[j],dp[j-f[i]]+f[i]);
            }
        }
        printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
    }
    return 0;
}






   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值