poj 1837计算让砝码平衡的方案数

/* 原题描述:http://acm.pku.edu.cn/JudgeOnline/problem?id=1837
从状态入手,发现,已知一个状态,在此基础上多挂一个物体得到的新状态,只与原状态的平衡度有关,与上面挂的什么无关。因此得到了方程。
dp[i][j] 表示在挂满前i个物体的时,平衡度为j的挂法的数量。j为正表示右面重。最极端的情况是所有物体都挂在最远端,
因此平衡度最大值为15*20*25=7500。原则上就应该有dp[ 0..20 ][-7500 .. 7500 ]。因此做一个处理,使得数组开为 dp[0.. 20][0..15000]。
现在说这个方程。dp[i][j]=sigma( dp[i-1][ j-c[k]*w[i] ] ), k=1~C, j=0~15000, i=1~20。初始状态 dp[0][7500]=1 表示不用物体时,
平衡度为0有一种挂法,当然那就是什么都不挂
复杂度O(C*G*15000)完全是可以接受的(以上内容来自:http://blog.csdn.net/AllenLSY/archive/2009/12/05/4945835.aspx
*/
#include <iostream>    
using namespace std;   
int C, G, dp[21][15001], c[21], w[21];   
int main()   
{   
    cin >> C >> G;//C可以在天平的C的地方挂砝码,共有G个砝码要挂 
 for(int i=1;i<=C;i++)  
        cin >> c[i];   
    for(int i=1;i<=G;i++)   
        cin >> w[i];   
    dp[0][7500]=1;   
     for(int i=1;i<=G;i++)   
    {   
       for(int j=-7500;j<= 7500;j++)   
        {   
            if (dp[i-1][j+7500]!=0)   
            {   
                for(int k=1;k<=C;k++)  
                    dp[i][j+c[k]*w[i]+7500]+=dp[i-1][j+7500];   
            }   
        }   
    }   
    cout << dp[G][7500]<<endl;   
    return 0;   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值