poj 1837 Balance

题目

题意:有一个类似天平的东西,左右两边臂长各15,然后给你一些臂上的挂钩和砝码,问把所有砝码放上去后天平达到平衡的的状态有多少种方案?

input: 

 C G     //挂钩个数  砝码个数       C (2 <= C <= 20) and the number G (2 <= G <= 20); 

C个数  //挂钩位置(负数代表在平衡点左边)

G个数  //砝码重量                         ascending order numbers in the range 1..25 representing the weights' values

 

dp[i][j]:表示就把前i个物品全部挂上时使天平达到平衡度为j的状态有多少种方案,这个平衡度j 与臂长和砝码重量有关。

力臂=重量 *臂长 

因此最极端的平衡度是所有物体都挂在最远端,因此平衡度最大值为j=15*20*25=7500。原则上就应该有dp[ 1~20 ][-7500 ~ 7500 ]。但是下标不能为负数,所以我们设dp[][7500]为平衡点,范围取到dp[][15000];

#include <iostream>
#include <cstring>
using namespace std;

int dp[21][15500];
/*dp[i][j]表示就把前i个物品全部挂上时
使天平达到平衡度为j的状态有多少种方案*/

int main()
{
    int c,g;//挂钩数、砝码个数
    int xc[21],xg[21];//挂钩位置和砝码重量
    cin>>c>>g;
    for(int i=1;i<=c;i++)
        cin>>xc[i];
    for(int i=1;i<=g;i++)
        cin>>xg[i];

    memset(dp,0,sizeof(dp));
    dp[0][7500]=1;//这个位置为天平平衡位置

    for(int i=1;i<=g;i++)//枚举砝码
    {
        for(int j=0;j<=15000;j++)//枚举度
            if(dp[i-1][j])
            for(int k=1;k<=c;k++)//枚举挂钩
                dp[i][j+xg[i]*xc[k]]+=dp[i-1][j];
    }
    cout<<dp[g][7500]<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值