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

zoj 3777 Problem Arrangement(状压dp)

时间:2016-04-22 12:03:05      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const double PI = acos(-1.0);
 5 
 6 ll dp[1<<13][700];  // n:某个状态     m: "interesting value"
 7                     // 状态转移:
 8 ll f[13];
 9 void init(){
10     f[1] = 1;
11     for(int i = 2 ; i <= 12 ; i ++){
12         f[i] = f[i-1] * i;
13     }
14 }
15 
16 ll gcd(ll a,ll b){
17     return b == 0 ? a : gcd(b,a%b);
18 }
19 
20 int main(){
21     int T;
22     cin >> T;
23     init();
24     while(T--){
25         int n,m,a[13][13];
26         memset(a,0,sizeof(a));
27         memset(dp,0,sizeof(dp));
28         cin >> n >> m;
29         for(int i = 0 ; i < n ; i ++){
30             for(int j = 0 ; j < n ; j ++){
31                 scanf("%d",&a[i][j]);
32             }
33         }
34         dp[0][0] = 1;  // 状态0,m=0
35         for(int i = 0 ; i < (1<<n) ; i ++){ //遍历状态 1 10 11 100 101 110 111
36             int tmp = 0;
37             for(int j = 0 ; j < n ; j ++){
38                 if(i & (1<<j)) tmp++;
39             }
40 
41             for(int j = 0 ; j < n ; j ++){
42                 if(i & (1 <<j)) continue;
43                 for(int k = 0 ; k <= m ; k ++){   //遍历 m: "interesting value"
44                     if(k + a[tmp][j] >= m)  dp[i + (1<<j)][m] += dp[i][k];  //  dp[10b][k] = 0 ;  dp[100b][k] = 0;
45                     else dp[i+(1<<j)][a[tmp][j] + k] += dp[i][k];
46                 }
47             }
48         }
49 
50         if(dp[(1<<n)-1][m] != 0) cout << f[n]/__gcd(dp[(1<<n)-1][m],f[n]) << "/" << dp[(1<<n)-1][m]/__gcd(dp[(1<<n)-1][m],f[n]) <<endl;
51         else cout << "No solution" << endl;
52     }
53 
54     return 0;
55 }

 

zoj 3777 Problem Arrangement(状压dp)

标签:

原文地址:http://www.cnblogs.com/zstu-jack/p/5420560.html

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