UVA - 562 Dividing coins

来源:互联网 发布:用java打印空心菱形 编辑:程序博客网 时间:2024/03/29 16:01

这道题初看不是dp ,但感觉十分像dp,如果直接去做的话,好像既没有最优子结构也没有重叠子问题。但是注意到最终的目的是尽量平分,就可以想办法转化:约数条件是一个人的总价值不超过总共的一半,目的是在此基础上尽量提高总价值。。相当于01背包里的体积和价值在这里都是价值。。。

不过对于01背包我还是觉得很模糊,仍然觉得这个解决过程对我来说有点抽象。。还是要尽量把道理想通啊。。。

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define MAX 110using namespace std;int dp[MAX][MAX*500],s[MAX];int main(){    int t,n,i,j,all,big;    s[0]=0;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        all=0,big=-1;        memset(dp,0,MAX*MAX*500*4);        for(i=1;i<=n;i++)        {            scanf("%d",&s[i]);            all+=s[i];        }        for(i=1;i<=n;i++)        {            for(j=0;j<=all/2;j++)            {                if(j>=s[i])                {                    dp[i][j]=max(dp[i-1][j-s[i]]+s[i],dp[i-1][j]);                }                else                    dp[i][j]=dp[i-1][j];            }        }        /*for(i=all/2;i>=0;i--)        {            for(j=1;j<=n;j++)                if(dp[j][i]>big)                big=dp[j][i];        }*/        printf("%d\n",(all-2*dp[n][all/2]));    }    return 0;}


0 0
原创粉丝点击