pku 2148 Cow Exhibition

2184 Cow Exhibition 0-1背包问题变形,选定一个值作状态后,另一值可被标识。如果有更多信息需记录(信息量-1)的数组应该可以的。http://acm.pku.edu.cn/JudgeOnline/problem?id=1717 Dominos这道题也是一道类似的题目,
还可以用搜索来做。把有利的值统统加入,同时记下可能使不符合的元素,做一次排除,找到正确的最优值。 

0-1背包有时(分堆)可以用随机贪心来做的,大致思路是从多的一堆中随机一个放入少的一堆中。

 

#include  < iostream >
#define  N 101
using   namespace  std;

int  f[N],s[N];
int  n,num;
int  total;
int  tF,tS;

int  findProper( int  a, int  b, int  idx)
{
    
if  (a >= 0   &&  b >= 0 )
    {
        
if  (a  +  b  > total)
            total 
=  a  +  b;
        
return  a + b;
    }
    
if  (idx >= num  ||  a  +  b  <  total)
        
return   0 ;
    
int  i  =  findProper(a,b,idx + 1 );
    
int  j  =  findProper(a + f[idx],b + s[idx],idx + 1 );
    
return  max(i,j);
}

int  main()
{
    
int  i;
    scanf(
" %d " , & n);
    total 
=  tF  =  tS  =  num  =   0 ;

    
int  a,b;
    
for  (i = 0 ; i < n;  ++ i)
    {
        scanf(
" %d%d " , & a, & b);

        
if  (a >= 0   &&  b >= 0 )
        {
            total 
+=  a + b;
            tF 
+=  a;
            tS 
+=  b;
        }
        
else   if  (a  *  b  <= 0 )
        {
            
if (a  +  b  >   0 )
            {
                tF 
+=  a;
                tS 
+=  b;
                a 
=   - a;
                b 
=   - b;
            }
            f[num]
= a;
            s[num]
= b;
            
++ num;
        }
    }
    printf(
" %d " ,findProper(tF,tS, 0 ));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值