首页 > ACM题库 > HDU-杭电 > HDU 3765-Celebrity Split-背包问题-[解题报告]HOJ
2015
04-10

HDU 3765-Celebrity Split-背包问题-[解题报告]HOJ

Celebrity Split

问题描述 :

Jack and Jill have decided to separate and divide their property equally. Each of their N mansions has a value between 1,000,000 and 40,000,000 dollars. Jack will receive some of the mansions; Jill will receive some of the mansions; the remaining mansions will be sold, and the proceeds split equally.

Neither Jack nor Jill can tolerate the other receiving property with higher total value. The sum of the values of the mansions Jack receives must be equal to the sum of the values of the mansions Jill receives. So long as the value that each receives is equal, Jack and Jill would like each to receive property of the highest possible value.

Given the values of N mansions, compute the value of the mansions that must be sold so that the rest may be divided so as to satisfy Jack and Jill.

输入:

The input consists of a sequence of test cases. The first line of each test case contains a single integer N, the number of mansions, which will be no more than 20. This line is followed by N lines, each giving the value of a mansion. The final line of input contains the integer zero. This line is not a test case and should not be processed.

输出:

The input consists of a sequence of test cases. The first line of each test case contains a single integer N, the number of mansions, which will be no more than 20. This line is followed by N lines, each giving the value of a mansion. The final line of input contains the integer zero. This line is not a test case and should not be processed.

样例输入:

5
6000000
30000000
3000000
11000000
3000000
0

样例输出:

41000000

< [if gte mso 9]>MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0

Hdu 3765 
Celebrity Split

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Total Submission(s): 18    Accepted Submission(s): 16

Problem Description

Jack and Jill have decided to separate and divide their property equally. Each of their N mansions has a value between 1,000,000 and 40,000,000 dollars. Jack will receive some of the mansions; Jill will receive some of the mansions; the remaining mansions will be sold, and the proceeds split equally.




Neither Jack nor Jill can tolerate the other receiving property with higher total value. The sum of the values of the mansions Jack receives must be equal to the sum of the values of the mansions Jill receives. So long as the value that each receives is equal, Jack and Jill would like each to receive property of the highest possible value.




Given the values of N mansions, compute the value of the mansions that must be sold so that the rest may be divided so as to satisfy Jack and Jill.

Input

The input consists of a sequence of test cases. The first line of each test case contains a single integer N, the number of mansions, which will be no more than 20. This line is followed by N lines, each giving the value of a mansion. The final line of input contains the integer zero. This line is not a test case and should not be processed.

Output

For each test case, output a line containing a single integer, the value of the mansions that must be sold so that the rest may be divided so as to satisfy Jack and Jill.

Sample Input

6000000 30000000 3000000 11000000 3000000 0

Sample Output

41000000

 

题目大意:Jack

Jill
要平分
N<=20
栋房子,每栋房子有自己的价格,他们两个人得到的房子价格之和必须相等,而不一定
20
栋房子能够被两个人平分,所以如果两个人平分后剩下没有被分到的房子要拿去拍卖,而他们希望拿去拍卖的房子价格最少,问最少的价格是多少。

这个题目一看很像背包题,我似乎感觉在以前做过很多这种类型的背包题,两个人分一堆东西什么的,但是仔细想想,貌似问的问题一般是“问能否平分”“假设A
拿的不少于
B
的,相对最公平的分发是神马……”呃……可能是俺孤陋寡闻了(这题如果哪位大神会背包的解法求教……)

N=20的时候其实如果枚举是可以解决的。

对于一个物品,要么给Jack
,要么给
Jill
,要么拍卖,所以可以递归求解。

#include <stdio.h>
#include <math.h>
int a[200];
int n;
int ans;
int sum[200];
void Divide(int p,int differ,int hav)//p为现在要拿的房子,differ为目前两个人房子价值的差距,hav为两个人共拿走的价值
{
    int i,j,n;
    if (differ==0)
    {
        if (hav>ans) ans=hav;
    }
    if (p<0) return;
    if (abs(differ)>sum[p]) return;//剪枝1:如果两个人拿到的差距比剩下的所有房子之和大,返回。
    if (sum[p]+hav<ans) return;//剪枝2:如果剩下的都加上还不能加到目前最大的答案ans,返回。
    Divide(p-1,differ+a[p],hav+a[p]);//给其中一个人
    Divide(p-1,differ-a[p],hav+a[p]);//给另一个人
    Divide(p-1,differ,hav);//拿去拍卖
}
int Solve()
{
    ans=0;
    Divide(n-1,0,0);
    return sum[n-1]-ans;
}
int main()
{
    int i,j;
    while(1)
    {
        scanf("%d",&n);
        if (n==0) break;
        for (i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if (i==0) sum[i]=a[i];
            else sum[i]=sum[i-1]+a[i];
        }
        printf("%d/n",Solve());
    }
    return 0;
}
 


其实递归是很好用的……


版权声明:本文为博主原创文章,未经博主允许不得转载。

参考:http://blog.csdn.net/magicnumber/article/details/6171707


  1. Excellent Web-site! I required to ask if I might webpages and use a component of the net web website and use a number of factors for just about any faculty process. Please notify me through email regardless of whether that would be excellent. Many thanks

  2. #include <cstdio>
    #include <algorithm>

    struct LWPair{
    int l,w;
    };

    int main() {
    //freopen("input.txt","r",stdin);
    const int MAXSIZE=5000, MAXVAL=10000;
    LWPair sticks[MAXSIZE];
    int store[MAXSIZE];
    int ncase, nstick, length,width, tmp, time, i,j;
    if(scanf("%d",&ncase)!=1) return -1;
    while(ncase– && scanf("%d",&nstick)==1) {
    for(i=0;i<nstick;++i) scanf("%d%d",&sticks .l,&sticks .w);
    std::sort(sticks,sticks+nstick,[](const LWPair &lhs, const LWPair &rhs) { return lhs.l>rhs.l || lhs.l==rhs.l && lhs.w>rhs.w; });
    for(time=-1,i=0;i<nstick;++i) {
    tmp=sticks .w;
    for(j=time;j>=0 && store >=tmp;–j) ; // search from right to left
    if(j==time) { store[++time]=tmp; }
    else { store[j+1]=tmp; }
    }
    printf("%dn",time+1);
    }
    return 0;
    }