uva52

タイトルの意味:コインは、2つの、公平で差を検索しようとすると、2つに分割されています。
合計/ 2、コイン/ 2の合計に1人だけ近くなるように
01ナップザック問題

二次元配列

#include<bits/stdc++.h>


#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>

using namespace std;


int dp[111][55555];
int v[111];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,i,j;
        cin>>n;
        int sum = 0;
        for(i=1; i<=n; i++)
        {
            scanf("%d",&v[i]);
            sum +=v[i];
        }
        int res = sum/2;
        memset(dp,0,sizeof(dp));
        for(i=1; i<=n; i++)
        {
            for(j=0; j<=res; j++)
            {
                if(j<v[i])
                    dp[i][j] = dp[i-1][j];
                else
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-v[i]]+v[i]);
            }
        }
        printf("%d\n",sum-2*dp[n][res]);
    }
    return 0;
}


配列

#include<bits/stdc++.h>


#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>

using namespace std;


int dp[55555];
int v[111];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,i,j;
        cin>>n;
        int sum = 0;
        for(i=1; i<=n; i++)
        {
            scanf("%d",&v[i]);
            sum +=v[i];
        }
        int res = sum/2;
        memset(dp,0,sizeof(dp));
        for(i=1; i<=n; i++)
        {
            for(j=res; j>=v[i]; j--)
            {
                dp[j] = max(dp[j],dp[j-v[i]]+v[i]);
            }
        }
        printf("%d\n",sum-2*dp[res]);
    }
    return 0;
}



おすすめ

転載: blog.csdn.net/weixin_44694282/article/details/90375878