划分问题(dp)

来源:互联网 发布:高中数学最优化问题 编辑:程序博客网 时间:2024/06/05 13:21


给出一个整数集合  , 将这个集合分成2个 和相等的集合。

思路就是  总和的一半作为一个目标容量,在集合中寻找是否可以有元素的和恰好为这个目标容量,也就转化为一个类似01背包问题。

这篇文章讲的比较详细

http://www.acmerblog.com/partition-problem-5801.html

#include <iostream>#include <algorithm>#include <stdio.h>using namespace std;int a[105];bool dp[105][50005];int main(){    int n;    while ( ~scanf("%d",&n) )    {        int sum=0;        for(int i=0;i<n;i++) {            cin >> a[i];            sum+=a[i];        }        if(sum%2 != 0) {            cout << "NO" << endl ;            continue;        }                int v=sum/2;                for(int i=0;i<=n;i++) dp[i][0]=true;        for(int i=0;i<=v;i++) dp[0][i]=false;        for(int j=1;j<=v;j++)            for(int i=1;i<=n;i++) {                dp[i][j]=dp[i-1][j];                if( j >= a[i-1] ) dp[i][j] = dp[i][j] || dp[i-1][j-a[i-1]];            }                    if( dp[n][v] ) cout << "YES" << endl;        else cout << "NO" << endl;    }    return 0;}


0 0