【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104757
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

描述
小卡卡终于帮农夫John找到了走丢的那一头奶牛,John为了感谢小卡卡,不仅告诉了他在Pascal山脉上可能存在Pascal圣地最大的宝藏,还说要请小卡卡喝牛奶。
可是农夫John发现他家里所储藏的牛奶已经喝光了,所以要临时给奶牛挤奶。小卡卡实在是太好心了,说要帮农夫John一起挤牛奶。John答应了,他把他的n头奶牛中的n/2头(n是个偶数)分给小卡卡挤,他自己挤剩下的n/2头奶牛。但是每一头奶牛都有不同的产奶量,农夫John为了让小卡卡减轻负担,他希望,他们两个所挤的牛奶的总量之差最小。
小卡卡得知了每头奶牛的产奶情况之后很快就解决了这个问题。

输入
该题含有多组测试数据。
每组测试数据第一行一个整数n,n为偶数且小于100。表示有n头奶牛。
第二行n个整数分别给出每头奶牛的产奶量(产奶量的总和不超过2000)。

输出
输出小卡卡和农夫所挤的牛奶量的最小差值。

样例输入
6
7 9 2 6 4 2

样例输出
0

【参考程序】:

#include<iostream>
#include
<cstring>
using namespace std;
bool bag[51][1001
];
int m[101],a[101
];
int
 n;
int
 main()
{
    
while (scanf("%d",&n)!=
EOF)
    {
        
int sum=0
;
        
for (int i=1;i<=n;i++
)
        {
            scanf(
"%d",&
a[i]);
            sum
+=
a[i];
        }
        memset(bag,
false,sizeof
(bag));
        bag[
0][0]=true
;
        memset(m,
0,sizeof
(m));
        
for (int i=1;i<=n;i++
)
            
for (int j=min(i,n>>1);j>=1;j--
)//最大奶牛数为n/2
                
for (int k=min(m[j-1]+a[i],sum>>1);k>=a[i];k--
)
                {//最大挤奶重量是sum/2
                    bag[j][k]
|=bag[j-1][k-
a[i]];
                    
if (bag[j][k] && m[j]<k) m[j]=
k;
                }//同样满足的取最能填的物品,因为可以使结果相差更小
        
for (int i=sum>>1;i>=0;i--
)
            
if (bag[n>>1
][i])
            {
                printf(
"%d\n",sum-(2*
i));
                
break
;
            }
    }
    
return 0
;
}


 

posted on 2009-08-04 17:08 开拓者 阅读(652) 评论(0)  编辑 收藏 引用 所属分类: 动态规划&背包经典习题

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理