• [搜索][51nod] 1268 和为K的组合


    1268 和为K的组合 

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

     收藏

     关注

    给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。

    Input

    第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <= 10^9)
    第2 - N + 1行:每行1个数,对应数组的元素A[i] (1 <= A[i] <= 10^6)

    Output

    如果可以,输出:"Yes",否则输出"No"。

    Input示例

    5 13
    2
    4
    6
    8
    10

    Output示例

    No

    解法可以说很多了 本质大同小异

    1. 枚举法

    #include <iostream>
    using namespace std;
    typedef long long ll;
    const int MAXN = 2e6;
    
    int arr[MAXN];
    int brr[MAXN];
    
    int main()
    {
    	int n, ans, flag = 1, len;
    		cin>>n>>ans;
    		
    	for(int i = 0; i < n; i++)
    	{
    		cin>>arr[i];
    		len = flag;
    		for(int j = 0; j < len; j++)
    		{
    			if(arr[i] + brr[j] == ans)
    			{
    				cout<<"Yes"<<endl;
    				return 0;
    			}
    			else if(arr[i] + brr[j] < ans)
    			{
    				brr[flag ++ ]= arr[i] + brr[j];
    			}
    		}
    		/*for(int j = 0; j < flag; j++)
    			cout<<brr[j]<<' ';
    		cout<<endl;*/
    	}
    	cout<<"No"<<endl;
    	return 0;
    }

    2.dfs

    #include <iostream>
    using namespace std;
    
    int a[110];
    int n, ans;
    int flag = false;
    
    void dfs(int nowsum, int pos)
    {
    	if(nowsum > ans)
    		return ;
    	if(nowsum == ans)
    	{
    		flag = true;
    		return ;
    	}
    	for(int i = pos + 1; i <= n && !flag; i++)
    	{
    		dfs(nowsum + a[i], i);
    	}
    }
    int main()
    {
    	cin>>n>>ans;
    	
    	for(int i = 1; i <= n; i++)
    		cin>>a[i];
    		
    	dfs(0,0);
    	
    	if(flag)
    		cout<<"Yes"<<endl;
    	else
    		cout<<"No"<<endl;
    		
    	return 0;
    }
    

    3。dp

    typedef long long ll;
    using namespace std;
    ll a[1000005];
    ll dp[1000005];
    int main()
    {
        ios::sync_with_stdio(false);
        ll n,m;
        while(cin>>n>>m)
        {
            ll flag=0;
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
            {
                cin>>a[i];
            }
            for(int i=1;i<=n;i++)
            {
                for(int j=m;j>=a[i];j--)
                {
                    dp[j]=max(dp[j-a[i]]+a[i],dp[j]);
                    if(dp[j]==m)
                    {
                        flag=1;
                        cout<<"Yes"<<endl;
                        break;
                    }
                }
                if(flag==1)break;
            }
            if(flag==0)cout<<"No"<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    Java自动化测试-02.编写第一个Java程序
    Java自动化测试-01.环境准备(JDK/环境变量/Intellij IDEA安装)
    eNSP 40报错(Virtualbox 0x80070005)现象与解决
    DDD初步认知
    微服务后业务系统围绕CAP的业务方案设计思考
    关于热点key读的一点思考
    Java并发——一些提高性能的方式
    Java并发——Synchronized
    dubbo学习(六)服务发布&引用
    dubbo学习(五)路由
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270669.html
Copyright © 2020-2023  润新知