标签:
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