ZZULI 1788: 小金刚的宝藏

原创 2015年11月21日 19:31:37

题目地址:点击打开链接

思路:价值和的一半为一个背包,往里面放东西就行了,刚开始输出搞错了,结果用搜索做超时了

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

typedef long long ll;
using namespace std;

int value[110];
int dp[100010];

int main()
{
    int t,n;
    int i,j,sum;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        sum = 0;
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%d",&value[i]);
            sum += value[i];
        }
        int m = sum / 2;
        for(i=0; i<n; i++)
        {
            for(j=m; j>=value[i]; j--)
            {
                dp[j] = max(dp[j],dp[j-value[i]] + value[i]);
            }
        }
        printf("%d\n",abs(sum-2*dp[m]));
    }
    return 0;
}

超时代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

typedef long long ll;
using namespace std;

int m,n,sum;
int value[110];
int visit[110];
int flag;

void dfs(int st,int sum1)
{
    int i;
    for(i=st; i<n; i++)
    {
        if(!visit[i])
        {
            if(sum1 + value[i] < m)
            {
                visit[i] = 1;
                dfs(i+1,sum1+value[i]);
                visit[i] = 0;
            }
            if(sum1 + value[i] >= m)
            {
                if(abs(sum-2*(sum1+value[i])) < flag)
                    flag = abs(sum-2*(sum1+value[i]));
                while(value[i] == value[i+1])
                    i++;
            }
        }
    }
}

int main()
{
    int t;
    int i;
    scanf("%d",&t);
    while(t--)
    {
        memset(visit,0,sizeof(visit));
        sum = 0;
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%d",&value[i]);
            sum += value[i];
        }
        m = sum / 2;
        flag = 10000000;
        dfs(0,0);
        printf("%d\n",flag);
    }
    return 0;
}


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

相关文章推荐

《加密小金刚》6.7

  • 2007年02月08日 21:26
  • 11KB
  • 下载

加密小金刚(钥匙盘型)

  • 2006年07月14日 00:00
  • 0B
  • 下载

zzuli OJ-1107 小火山的宝藏收藏(dfs+邻接表)

Description      进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通。   每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关。如果小火山取走了...

《加密小金刚》5.5

  • 2006年07月20日 00:00
  • 0B
  • 下载

加密小金刚5.5

  • 2006年07月14日 00:00
  • 0B
  • 下载

Zzuli OJ-----1907小火山的宝藏收益

1907: 小火山的宝藏收益 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 169  Solved: 47 SubmitStatusWeb Bo...

加密小金刚(钥匙盘型)

  • 2006年07月14日 00:00
  • 0B
  • 下载

加密小金刚(压缩型)

  • 2006年05月19日 00:00
  • 0B
  • 下载

源码探索系列3---四大金刚之Activity的启动过程完全解析

在不同版本API,底层实现有些不一样,所以这里贴出现在在看的API版本号 API: 23关于Activity的四个启动flag,这里下次再说。 先说下我们熟悉的一句吧startActivity(n...
  • f112122
  • f112122
  • 2015年12月15日 00:32
  • 805

加密小金刚5.8

  • 2006年09月13日 16:21
  • 40KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZZULI 1788: 小金刚的宝藏
举报原因:
原因补充:

(最多只允许输入30个字)