码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1837 Balance (dp,01背包)

时间:2014-08-06 19:18:12      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:dp   01背包   

链接:poj 1837

题意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,

求将钩码挂到钩子上使天平平衡的方法的总数。其中可以把天枰看做一个以x轴0点作为平衡点的横轴

分析:力臂=重量 *臂长 = g[i]*c[j]

当平衡度k=0时,说明天枰达到平衡,k>0,说明天枰倾向右边(x轴右半轴),k<0则左倾

因此可以定义一个 状态数组dp[i][k],意为在挂满前i个钩码时,平衡度为k的挂法的数量。

由于距离c[i]的范围是-15~15,钩码重量的范围是1~25,钩码数量最大是20

因此最极端的平衡度是所有物体都挂在最远端,因此平衡度最大值为j=15*20*25=7500

原则上就应该有dp[ 1~20 ][-7500 ~ 7500 ]。

因此为了不让下标出现负数,做一个处理,使使得数组开为 dp[1~20][0~15000],则当j=7500时天枰为平衡状态

状态方程为 dp[i][k]+=dp[i-1][k-g[i]*c[j]];

#include<stdio.h>
#include<string.h>
int dp[21][15010];
int main()
{
    int m,n,i,j,k,c[21],g[21];
    scanf("%d%d",&m,&n);
    for(i=1;i<=m;i++)
        scanf("%d",&c[i]);
    for(i=1;i<=n;i++)
        scanf("%d",&g[i]);
    memset(dp,0,sizeof(dp));
    dp[0][7500]=1;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            for(k=g[i]*c[j];k<=15000;k++)
                dp[i][k]+=dp[i-1][k-g[i]*c[j]];
    printf("%d\n",dp[n][7500]);
    return 0;
}


poj 1837 Balance (dp,01背包),布布扣,bubuko.com

poj 1837 Balance (dp,01背包)

标签:dp   01背包   

原文地址:http://blog.csdn.net/acm_code/article/details/38402481

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!