1019 Problem S

1019 Problem S

题意:给定一组设备的价值V,及其数量M,如果能够将这组设备分为两组,并使其价值A、B,并且A>=B。

思路:对于所有设备的价值,求得总价值的1/2后,然后将题目转化为0-1背包。

感想:题目一上来,将设备分组,很可能无从下手,而通过其平均价值,转化为0-1背包后,只要弄清价值、数量,几个循环之间的关系,以及状态方程即可。

#include<iostream>

using namespace std;

int f[111111],v[51],m[101];

int main(){

    int i,j,k,N,sum,w;

    while(cin>>N){

        if(N<0) break;

       for(i=0;i<N;i++)

          cin>>v[i]>>m[i];

        sum=0;

       for(i=0;i<N;i++)

           sum+=v[i]*m[i];

        w=sum/2;

        for(i=0;i<=w;i++)

            f[i]=0;

       for(i=0;i<N;i++)

       for(k=0;k<m[i];k++)

       for(j=w;j>=v[i];j--)

          f[j]=max(f[j],f[j-v[i]]+v[i]);

       cout<<sum-f[w]<<" "<<f[w]<<endl;

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值