zoukankan      html  css  js  c++  java
  • ural 1005 Stone Pile DP

    /*

    题目:

        把石头分成两堆,问最小的重量差值为多少。

    分析:

        先求和,然后用和的一半转为01背包。转移方程为:

        dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+w[i]);

        缩小维度后为dp[j] = max(dp[j],dp[j-w[i]]+w[i]);

    */

    #include <iostream>

    #include <cstring>

    #include <cstdio>

    using namespace std;

    const int X = 2000010;

    int dp[X],w[25],n;

    int main()

    {

        freopen("sum.in","r",stdin);

        freopen("sum.out","w",stdout);

        while(cin>>n)

        {

            if(n==1)    //输入为1时,直接输出即可

            {

                scanf("%d",&w[0]);

                cout<<w[0]<<endl;

                continue;

            }

            int sum = 0,temp,ans;

            for(int i=1;i<=n;i++)

            {

                scanf("%d",&w[i]);

                sum += w[i];

                dp[i] = 0;

            }

            temp = sum>>1;  //除二

            dp[0] = 0;

            for(int i=1;i<=n;i++)   //状态转移方程

                for(int j=temp;j>=w[i];j--)

                    dp[j] = max(dp[j-w[i]]+w[i],dp[j]);

            for(int i=temp;i>=0;i--)

                if(dp[i]!=0)    //当不为零时即为所求的一半石子重量

                {

                    ans = dp[i];

                    break;

                }

            ans = 2*ans-sum;

            ans = max(ans,-ans);

            cout<<ans<<endl;

        }

        return 0;

    }

  • 相关阅读:
    生成全局id的方式
    如何使得搜索的信息更准确?
    水平分区
    大表如何优化?
    MySQL_fetch_array和MySQL_fetch_object的区别是什么?
    BLOB和TEXT区别
    如何在Unix和MySQL时间戳之间进行转换?
    用ActionSupport实现验证
    服务器端验证--验证框架验证required.
    自定义类型转换器converter
  • 原文地址:https://www.cnblogs.com/yejinru/p/2476962.html
Copyright © 2011-2022 走看看