找数达人

来源:互联网 发布:剑网三萝莉脸型数据图 编辑:程序博客网 时间:2024/04/25 15:27

                                                                              找数达人

                                                                                                         时间限制:1000 ms  |  内存限制:65535 KB
描述

 

简单的题意如下:

小明最近做出了一道题:如何在一组数中寻找三个数,这三个数的和等于一给出的定值m,洋洋得意。于是小华不乐意了,别问为什么...,于是小华说,你能找找在一组数字中是否有n个数,使得这n个数的和等于一给定的定值m吗?


 1): 0 < n <= 10000

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

 3): 0 <= m <=10000

 4): 0 <= 数组中的数 <=10000

还有比这更简单易懂的题目吗???


输入
多组数据,每组两行,第一行为序列内容,第二行为m的值。
输出
如能找到,输出Yes,否则,输出No。
样例输入
1 3 4 5
5
1 3 4 5 9
2
样例输出
Yes
No
   这题就是0-1背包问题,难点在于它的数据输入。
AC代码:
 #include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const int T = 0x3f3f3f3f;long long a[2000010],dp[2000010];int Solve(int n,int m){for(int i=0;i<m;++i){if(n<a[i])return 0;for(int j=n;j>=a[i];--j){dp[j]=min(dp[j],dp[j-a[i]]+a[i]);if(dp[n]==n)return 1;}}return dp[n]==n?1:0;}void INIT(int n){for(int i=0;i<=n;++i){dp[i]=T;}dp[0]=0;}int main(){/*freopen("input.txt","r",stdin);*/char c;int n,m=0,x=0;  while(~(c=getchar()))  {        if(c>='0'&&c<='9')x=x*10+c-'0';else if(c==' '){a[m++]=x;x=0;}else{a[m++]=x;scanf("%d",&n);if(n==0)printf("No\n");else{INIT(n);sort(a,a+m);if(Solve(n,m)>0)printf("Yes\n");elseprintf("No\n");}x=0;m=0;cin.get();}  }return 0;}        


0 0
原创粉丝点击