问题标题: 酷町堂:1210题怎么做(求思路)

0
1

1
已采纳
陆姗姗
陆姗姗
资深守护
资深守护

先计算出所有西瓜的总重量sum,然后根据总重量的一半sum/2来找以sum/2为最大重量的时候用01背包问题的思路来找此时可以达到的最大重量max,总重量是sum,我们找到其中的一份的重量是max,那么另一份的重量是sum-max,所以两份重量的差值是(sum-max)-max

 

最好的情况是max==sum/2,此时差值为0

即使max!=sum/2,max也是当前里sum/2最近种情况,所以差值一定也是最小的

1
栾峻岩
栾峻岩
初级天翼
初级天翼

01背包,如例题,

 for (int i=1;i<=n;i++)
    {
        for (int j=0;j<=v;j++)
        {
            if (w[i]>j)
            {
                f[i][j]=f[i-1][j]; 
            }
            else
            {
                动态转移方程。
            }
        }
    }
    cout<<f[n][v];

F是二维数组,可以画一个n*v的方格,枚举,输出最后答案,数组要定义大,

至于输入吧,注意题目,如果n和v都是0,则return 0;

输入先按老样子输入,最后int a,b,输入a和b(最后两个是多余的,0和0,但是要输入,否则算错!)

栾峻岩在2018-02-07 22:36:43追加了内容

不对,发错了……………………

1
栾峻岩
栾峻岩
初级天翼
初级天翼
for (int i=1;i<=n;i++)
    {
        cin>>w[i];
        c[i]=w[i];
        v+=w[i];
    }
    v1=v/2;

然后就是01背包的语句了,(就是我刚刚发给你的那个。)

0
我要回答