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

【题目分析】在一组数字中是否有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;
}
时间: 2024-08-05 20:41:11

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

数字择优( 计算一个数与一组数字中的哪一个数字大小最接近)

一,应用场景 应需求根据两组经纬度计算出B点相对于A点的角度后,根据这个角度在一组预置点中选取最近的一个预置点 二,代码部分 1 /** 2 * 计算一个数与一组数字中的哪一个数字大小最接近 3 * @param re 4 * @param ble 5 * @return 6 */ 7 public static int choicePreset(int[] re,int ble) { 8 //1.存差值的绝对值 9 int[] result=new int[re.length]; 10 //2

输出一组数字中的最小数

方法一: function sortNumber(a,b){ return a - b } function min() { var arr = [] for (var i=0; i<arguments.length; i++){ arr[i] = arguments[i] } document.write(arr.sort(sortNumber)[0]) } min(2, 4, 1, -1, 56, 3, -7) 方法二: function min() { var minNumber=argu

一组数据中只有一个数字出现一次,其他数成对出现,找出这个数

一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的,请找出这个数字. (使用位运算) 直接使用异或运算. 代码如下: #include<stdio.h> #include<stdlib.h> int main() { int arr[]={3,5,9,2,5,3,2};  int size=sizeof(arr)/sizeof(arr[0]); int i=0,find=0; for(;i<size;i++) { find^=arr[i];//循环进行异或运算 }

找出一组数中只出现一次的两个数,其他所有数都是成对出现的

题目: 给一组数,只有两个数只出现了一次,其他所有数都是成对出现的.怎么找出这两个数.编写函数实现. 题目分析: 上次介绍了,对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,但是对于找出两个出现一次的数应该怎么解决呢?先对所有的元素进行异或,则结果为两个出现一次的数的异或结果,然后将结果转换为二进制,找出二进制数中的第一个1,然后根据这个1的判断条件进行分组,分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数. 例如:数组中的元素为下面这

一组数组中只有一个数(两个数)出现一次,其他的都成对出现,找出该数

一组数据中只有一个数字出现了一次.其他所有数字都是成对出现的.请找出这个数字.(使用位运算) >可以这么理解:如果两个数相等,它们异或之后的结果是0.而0与任何数异或都是该数本身. (比如00000001^00000001结果是0.00000000^00000001=00000001) 那么将一组数中所有元素异或,相同的数字结果是0,最后的结果就是单独出现的数字. 编程实现如下: #include <stdio.h> #include <windows.h> int main

小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和

小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数. 输入描述: 输入第一行为数字个数n (n ≤ 20) 第二行为n个数xi (1

一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数

先看一个简单的,一组数中,只有一个数只出现了奇次,其他所有数都是成对出现的,找出出现奇次数的数.对于这个题,我们只需对所有数及逆行异或即可.理论公式: a⊕b=b⊕a a⊕0=a a⊕b⊕b=a a⊕(b⊕c)=(a⊕b)⊕c 代码: #include <stdio.h> #include <stdlib.h> int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; int ret = 0; int len = sizeof(arr) /

c++实验5--统计输出字符串中(大/小写)字母个数,数字个数及其它字符个数。

一.问题及代码 /* * 文件名称: * 作 者: 杨楚莛 * 完成日期: 2016 年 5 月 3 日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分:统计输出字符串中(大/小写)字母个数,数字个数及其它字符个数. * 输入描述: * 问题描述: * 程序输出: * 问题分析: * 算法设计: */ #include<iostream> #include<cstdio> using namespace std; int main() { char str[50]; in

Python(66)_判断用户传入的参数str中计算数字,字母,空格,以及其他的个数,并返回结果

#-*-coding:utf-8-*- ''' 写函数,判断用户传入的参数str中计算数字,字母,空格,以及其他的个数,并返回结果 ''' content = input('>>>') def func(s): num = 0 alpha = 0 space = 0 others = 0 dic ={ 'num':0, 'alpha':0, 'space':0, 'other':0 } for i in s: if i.isdigit(): dic['num'] +=1 elif i.i