列表

详情


DP45. 分割等和子集

描述

给定一个只包含正整数的数组 nums ,请问能否把这个数组取出若干个数使得取出的数之和和剩下的数之和相同。

数据范围: , 数组中的元素满足

输入描述

第一行输入一个正整数 n ,表示数组 nums 的长度。
第二行输入 n 个正整数,表示数组中的值。

输出描述

如果满足题目条件,输出 true ,否则输出 false

示例1

输入:

4
1 5 11 5

输出:

true

示例2

输入:

4
1 2 3 5

输出:

false

原站题解

C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-13

#include <iostream>
#include <unordered_map>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include<cstdio>
#include<cstdlib>
#include<climits>

using namespace std;



int main()
{
    int n,rest=0;
    cin>>n;
    vector<int>    num(n);
    for(int i=0;i<n;i++){
        cin>>num[i];
        rest+=num[i];
    }
    if(rest%2==1)    {cout<<"false"; return 0;}
    unordered_map<int,bool> mp;
    mp[0]=true;
    for(int i=0;i<n;i++)
    {
        for(auto it=mp.begin();it!=mp.end();it++)
        {
            if(it->first+num[i]==rest/2){
                cout<<"true";
                return 0;
            }
            mp[it->first+num[i]]=true;
        }
    }
    cout<<"false";
}

/*


int main()
{
    int n,rest=0;
    cin>>n;
    vector<int>    num(n);
    for(int i=0;i<n;i++){
        cin>>num[i];
        rest+=num[i];
    }
    vector<vector<bool>>  dp(n+1,vector<bool>(rest+1,false));
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=rest;j++)
        {
            if(rest-j==j) dp[i][j]=true;
            if(rest-j>j)  dp[i][j]=false;
        }
    }
    for(int i=n-1;i>=0;i--)
    {
        for(int j=0;j<=rest;j++)
        {
            dp[i][j]=dp[i+1][j];
            if(j-num[i]>=0)
                dp[i][j]=dp[i][j]||dp[i+1][j-num[i]];
        }
    }
    
    cout<<(dp[0][rest]?"true":"false");
    
}
*/

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-06-02

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,msum=0;
    int nums[502];
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>nums[i];
        msum+=nums[i];
    }
    
    if(msum%2==1){
        cout<<"false";
    }else{
        cout<<"true";
    }
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-04-22

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;

int main(){
    int n;
    cin>>n;
    vector<int> nums(n);
    int sum=0;
    for(int i=0;i<n;i++){
        cin>>nums[i];
        sum+=nums[i];
    } 
    if(sum%2!=0) {
        cout<<"false";
        return 0;
    }
    
    //vector<int> dp(sum+1);
    unordered_map<int,bool> mp;
    mp[0]=true;
    for(int i=0;i<n;i++)
        for(auto it=mp.begin();it!=mp.end();it++){
            if(it->first+nums[i]==sum/2){
                cout<<"true";
                return 0;
            }
            mp[it->first+nums[i]]=true;
        }
    cout<<"false";
    return 0;
    
    
}

C++ 解法, 执行用时: 4ms, 内存消耗: 404KB, 提交时间: 2022-05-08

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    int sum = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        sum += a[i];
    }
    if (sum % 2 != 0) {
        cout << "false";
        return 0;
    }
    unordered_map<int, bool> p;
    p[0] = true;
    for (int i = 0; i < n; i++)
        for (auto it = p.begin(); it != p.end(); it++) {
            if (it->first + a[i] == sum / 2) {
                cout << "true";
                return 0;
            }
            p[it->first + a[i]] = true;
        }
    cout << "false";
    return 0;


}

C++ 解法, 执行用时: 4ms, 内存消耗: 408KB, 提交时间: 2022-06-18

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1009;
int dp[N],a[N];
bool cmp(int a,int b)
{
	return a>b;
 } 
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
		if(dp[i-1]<=0)
		dp[i]=dp[i-1]+a[i];
		else
		dp[i]=dp[i-1]-a[i];
	}
	if(dp[n]==0) cout<<"true";
	else cout<<"false";
	return 0;
}

上一题