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

poj 1837 天平问题(01背包变种)

时间:2017-08-25 17:43:32      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:cstring   using   mem   log   更新   题解   平衡   style   题意   

题意:给你n个挂钩,m个砝码,要求砝码都用上,问有多少中方案数

题解:对于这道题目的状态,我们定义一个变量j为平衡度,当j=0的时候,表明天平平衡。定义dp[i][j]表达的含义为使用前n个砝码的时候,平衡度为j的方案数。计数类型的背包,更新的时候把每个砝码的所有可能贡献(每个砝码可以放在不同的钩子上,每个钩子的离中点的距离不一致)都updata一下就ok了。关键是状态的抓取,然后这个计数背包的理解。

ac代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define mt(a) memset(a,0,sizeof(a))
using namespace std;
int dp[26][16000];
int c[26];
int w[26];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>c[i];
    for(int i=1;i<=m;i++) cin>>w[i];
    mt(dp);
    dp[0][7500]=1;
    for(int i=1;i<=m;i++)
    {
        for(int j=0;j<=15000;j++)
        {
            for(int k=1;k<=n;k++)
            {
                if(dp[i-1][j]) dp[i][j+c[k]*w[i]]+=dp[i-1][j];
            }
        }
    }
    cout<<dp[m][7500]<<endl;
    return 0;
}

 

poj 1837 天平问题(01背包变种)

标签:cstring   using   mem   log   更新   题解   平衡   style   题意   

原文地址:http://www.cnblogs.com/z1141000271/p/7428926.html

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