使用动态编程构建解决方案

时间:2015-12-30 05:13:37

标签: recursion dynamic-programming

鉴于一个最多100个芯片的包,每个芯片都有它的值。 确定两个人之间最公平的分工。这意味着每个人获得的金额之间的差异应该最小化。筹码的价值从1到1000不等。

输入:硬币的数量m,以及每枚硬币的价值。

输出:两个人从相应的包中分割筹码时获得的最小正差。

我发现很难为它形成DP解决方案。请帮帮我。

最初我不得不尝试将它作为非DP解决方案。实际上我还没有想过用DP解决它。我只是对值数组进行了排序。并将最大值分配给其中一个人,并将其他值逐渐分配给两个中的一个,具体取决于哪个创建最小差异。但该解决方案实际上并没有奏效。

我在这里发布我的解决方案:

bool myfunction(int i,int j)

{

return(i >= j) ;

}

int main()

{

int T, m, sum1, sum2, temp_sum1, temp_sum2,i ;

cin >> T ;

while(T--)

    {

        cin >> m ;

        sum1 = 0 ; sum2 = 0 ; temp_sum1 = 0 ; temp_sum2 = 0 ;

        vector<int> arr(m) ;

        for(i=0 ; i < m ; i++)

            {

                cin>>arr[i] ;

            }

            if(m==1 )

                {

                    if(arr[0]%2==0)
                        cout<<0<<endl ;

                    else
                        cout<<1<<endl ;
                }

        else {      

        sort(arr.begin(), arr.end(), myfunction) ;

    //  vector<int> s1 ;

    //  vector<int> s2 ;

        for(i=0 ; i < m ; i++)

            {

                temp_sum1 = sum1 + arr[i] ;

                temp_sum2 = sum2 + arr[i] ;

                if(abs(temp_sum1 - sum2) <= abs(temp_sum2 -sum1))

                    {

                        sum1 = sum1 + arr[i] ;
                    }

                    else

                        {

                            sum2 = sum2 + arr[i] ;
                        }

                        temp_sum1 = 0 ;

                        temp_sum2 = 0 ;

            }

            cout<<abs(sum1 -sum2)<<endl ;


      }

    }



return 0 ;

}

1 个答案:

答案 0 :(得分:0)

我从你的问题中理解的是你想要将筹码分成两个人,以便最大限度地减少写在这些筹码上的数字之和的差异。 如果理解是正确的,那么您可以按照以下方法找到解决方案。

  1. 对值数组进行排序,即int值[100]
  2. 开始在for循环中添加数组两端的元素,即for(i = 0; j = values.length; i&lt; j; i ++,j - )
  3. 奇数编号的迭代和属于一个人&amp;偶数编号给其他人
  4. 运行循环直到i&lt; j
  5. 现在,奇数&amp;和两个和之间的差异因为数组早先排序,所以偶数迭代应该是最小的。
  6. 如果我对问题的理解是正确的,那么此解决方案应该可以解决您的问题。
    酌情反思。

    由于
    拉温德拉