HDU 1171 Big Event in HDU

写这题的过程中,还是碰到不少问题的。首先就是这题出现在背包的训练中,所以要求用背包来写。可是它Y的我想了半天就是没想到怎么用背包,于是我就想先用其它办法解决再说。可是试了两个小时,最后却是WA,无奈只能老老实实开始背包了。于是就开始寻找和背包的相同点:容量为V的背包,有N个物品,第i个物品价值为value[i],占据背包的容量为cost[i]。然后我就从本题中来寻找。首先N个物品是可以实现的,虽然题目中有的设备可以有多个,但只要看成多个0-1背包就可以了。物品价值也是有的,接下来就是每个物品的花费和总容量的问题了。最先我是想用设备的总个数来代替总容量的,这样每个设备的花费cost就是1,可是我画了表模拟0-1背包的实现过程,结果悲催的发现不行。然后就继续寻找。突然之间,灵感来了。题目要求两个学院的设备价值尽量相等,于是我在想是不是可以用总价值的一半作为背包的容量呢?因为,其中一个学院的价值肯定不会超过总价值的一半,这样cost=value是很显然的了,即花费值就是设备的价值。用这个思路编写代码,最终终于AC了。不过,有人0ms,那是牛人啊,我等渣渣只能如此了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <deque>
#include <vector>
using namespace std;
const int N=250005;
int value[N],cost[N],result[N];
int main()
{
    int n,a,b;
    while(scanf("%d",&n))
    {
        if(n<0)
            break;
        int total_num=1,total_value=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            total_value+=a*b;
            for(int j=1;j<=b;j++)
                value[total_num]=a,cost[total_num++]=a;
        }
        //printf("total_num:%d\n",total_num);
        //printf("total_value:%d\n",total_value);
        for(int i=0;i<total_value;i++)//一开始total_value被我写成total_num,结果WA了。
            result[i]=0;
        int half_value=total_value/2;
        for(int i=1;i<total_num;i++)
        {
            for(int j=half_value;j>=cost[i];j--)
            {
                int temp=result[j-cost[i]]+value[i];
                if(result[j]<temp)
                    result[j]=temp;
            }
        }
        //for(int i=0;i<=half_value;i++)
           // printf("%d ",result[i]);
       // printf("\n");
        printf("%d %d\n",total_value-result[half_value],result[half_value]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值