码迷,mamicode.com
首页 > 其他好文 > 详细

在一组数字中是否有n个数,使得这n个数的和等于一给定的定值m

时间:2015-07-25 16:52:57      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:字符串

【题目分析】在一组数字中是否有n个数,使得这n个数的和等于一给定的定值m。

【思路分析】:分析数据的情况下:

  1): 0 < n <= 100000

 2): 0 < 序列长度 <= 100000

 3): 0 <= m <=100000 

数据小的话:用类似于dp的思路,

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;

#define rep(i,j,k) for(int i=(int)j;i<(int)k;++i)
#define per(i,j,k) for(int i=(int)j;i>(int)k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))

typedef long long LL;
typedef unsigned long long LLU;
typedef double db;

const int N=1e5+10;
const int inf=0x3f3f3f3f;

int t,n,m;
int pre[N],last[N];
int num[N];

int main()
{
    int x=0;
    char ch;
    int sum=1;
    mem(last,0);
    while(~(ch=getchar())){
        if(isdigit(ch)) x=x*10+ch-'0';
        else if(ch!='\n'){
            pre[sum++]=x;
            x=0;
        }
        else{
            pre[sum++]=x;
            mem(last,0);
            last[0]=1;
            m=read();
            for(int i=1; i<sum; ++i){
                for(int j=m; j>=0; --j){
                    int k=pre[i]+j;
                    if(last[j]&&k<=m) last[k]=1;
                    //cout<<"k="<<k<<" "<<"last[k]"<<last[k]<<endl;
                }
            }
            if(last[m]) puts("Yes");
            else puts("No");
            x=0;
            sum=1;
            mem(last,0);
        }
    }
    return 0;
}


在一组数字中是否有n个数,使得这n个数的和等于一给定的定值m

标签:字符串

原文地址:http://blog.csdn.net/u013050857/article/details/47057513

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!