http://codeforces.com/contest/295/problem/C
简单DP
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #define ll long long using namespace std; const int N=55; const ll MOD = 1000000007; ll dp[N*4][N][N]; ll c[N][N]; int main() { //freopen("data.in","r",stdin); for(int i=0;i<N;++i) for(int j=0;j<=i;++j) { if(i==j||j==0) c[i][j]=1; else c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD; } int n,m; while(cin>>n>>m) { int a=0; int b=0; for(int i=1;i<=n;++i) { int tmp; cin>>tmp; if(tmp==50) ++a; if(tmp==100) ++b; } memset(dp,0,sizeof(dp)); dp[0][a][b]=1; ll ans=-1; int i; for(i=0;i<n*4;++i) { for(int l=0;l<=a;++l) { for(int r=0;r<=b;++r) if(dp[i][l][r]>0) {//cout<<i<<" "<<l<<" "<<r<<" "<<dp[i][l][r]<<endl; if(l==0&&r==0) {ans=dp[i][l][r];break;} int l2=((i&1)==0)?l:a-l; int r2=((i&1)==0)?r:b-r; for(int l1=0;l1<=l2;++l1) for(int r1=0;r1<=r2;++r1) { if(l1+r1==0||(l1*50+r1*100)>m)continue; int w=((i&1)==0)?l-l1:l+l1; int h=((i&1)==0)?r-r1:r+r1; dp[i+1][w][h]=(dp[i+1][w][h]+((c[l2][l1]*c[r2][r1]%MOD)*dp[i][l][r])%MOD)%MOD; } } if(ans!=-1) break; } if(ans!=-1) break; } if(ans==-1) {cout<<"-1"<<endl;cout<<"0"<<endl;} else {cout<<i<<endl;cout<<ans<<endl;} } return 0; }