Round 3 D

来源:互联网 发布:江边城外 知乎 编辑:程序博客网 时间:2024/06/06 06:52

原题链接:
http://poj.org/problem?id=1837

大意:
一个天平,已知钩子坐标和重物重量,且重物都要用上,求让天平平衡的方法数。

思路:
树形DP,讲每个重物的力矩算出来并求和建树。
以样例为例:

Sample Input
2 4
-2 3
3 4 5 8
Sample Output
2

这里写图片描述

数最后有多少 0 即可。代码实现时可以用最后一个力矩取负值来查找 取代数几个0 的方法。

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<set>#include<map>using namespace std;#define D(v) cout<<#v<<" "<<v<<endl#define mem(s,t) memset(s,t,sizeof(s))const int MAXN =25;int C,G;int c[MAXN],g[MAXN];set<int> s,S;map<int,int> m,M;typedef set<int>::iterator It;int main(){    cin>>C>>G;    for(int i=0;i<C;i++){        cin>>c[i];    }    for(int j=0;j<G;j++){        cin>>g[j];    }    M[0]=1;    for(int i=0;i<G-1;i++){        m=M;        s=S;        M.clear();        S.clear();        s.insert(0);        for(int j=0;j<C;j++){            int val =g[i]*c[j];            for(It it=s.begin();it!=s.end();it++){                //D(*it);                S.insert(*it+val);                M[*it+val] += m[*it];            }        }    }    int cnt=0;    int Ans=0;    for(int i=0;i<C;i++){        Ans=c[i]*g[G-1];        cnt+=M[-Ans];    }    cout<<cnt<<endl;    return 0;}
原创粉丝点击