心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
题目大意:给出n个数,分成两组,每组和的差尽量小。
背包问题。计算出n个数所有的组合情况即可。具体做法是,如果d[j]==true,那么d[j+r[i]]也一定为true。
以下是我的代码:
#include<cstdio>
#include
<cstring>
using namespace std;
const int kMaxn(107);

int n,sum,r[kMaxn];
bool d[50007];

int main()
{
    #ifndef ONLINE_JUDGE
    freopen(
"data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    
#endif

    
int T;
    scanf(
"%d",&T);
    
while(T--)
    {
        sum
=0;
        scanf(
"%d",&n);
        
for(int i=1;i<=n;i++)
        {
            scanf(
"%d",&r[i]);
            sum
+=r[i];
        }

        memset(d,
false,50007*sizeof(bool));
        d[
0]=true;
        
for(int i=1;i<=n;i++)
            
for(int j=sum-d[i];j>=0;j--)
                
if(d[j])
                    d[j
+r[i]]=true;

        
for(int i=(sum>>1);i>=0;i--)
            
if(d[i])
            {
                printf(
"%d\n",sum-(i<<1));
                
break;
            }
    }

    
return 0;
}
posted on 2011-05-25 20:13 lee1r 阅读(662) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:动态规划

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