题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777

Time Limit: 2 Seconds      Memory Limit: 65536 KB

The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As we know, the arrangement will have a great effect on the result of the contest. For example, it will take more time to finish the first problem if the easiest problem hides in the middle of the problem list.

There are N problems in the contest. Certainly, it's not interesting if the problems are sorted in the order of increasing difficulty. Edward decides to arrange the problems in a different way. After a careful study, he found out that the i-th problem placed in the j-th position will add Pij points of "interesting value" to the contest.

Edward wrote a program which can generate a random permutation of the problems. If the total interesting value of a permutation is larger than or equal to M points, the permutation is acceptable. Edward wants to know the expected times of generation needed to obtain the first acceptable permutation.

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

The first line contains two integers N (1 <= N <= 12) and M (1 <= M <= 500).

The next N lines, each line contains N integers. The j-th integer in the i-th line is Pij (0 <= Pij <= 100).

Output

For each test case, output the expected times in the form of irreducible fraction. An irreducible fraction is a fraction in which the numerator and denominator are positive integers and have no other common divisors than 1. If it is impossible to get an acceptable permutation, output "No solution" instead.

Sample Input

2
3 10
2 4 1
3 2 2
4 5 3
2 6
1 3
2 4

Sample Output

3/1
No solution

题意:

有n个题目,按从简单到难,若把第i难的题目放到第j个位置,会产生P[i][j]的“有趣度”;

现在有一个随机产生这n个题目排列的程序,若一个排列它的所有题目有趣度之和大于等于m,则算作满足要求;

求产生一个满足要求的题目排列的期望次数。

题解:

状压DP做法:state是一个n位的二进制数,每一位 1 or 0 代表了该位置是否被占掉了;

假设dp[state][k]代表:前i道题的放置情况按state安排,产生有趣度为k的方案数;

状态转移:

  若要计算cnt道题目按state安排情况下,dp[state][k]的值(所有有趣度k>m的方案都算在k=m里),则:

  从state里去掉一道题目,假设去掉的是放在第i个位置上的那道题目,得到new_state(这个new_state必然小于state),

  再枚举k=0~m,dp[state][(k+p[cnt][i])] += dp[new_state][k],同样记得把所有有趣度k>m的方案都算到k=m里。

正确性:

当state=0时,即初始dp[0][0]为1,dp[0][1~m]都为0,这是正确的,故可以从state=1开始状态转移;

同时,正如前面说的new_state必然小于state,我们从小到大枚举state,那么计算state时所有new_state都必然已经计算好了。

AC代码:

#include<bits/stdc++.h>
using namespace std; int n,m;
int p[][];
int dp[<<][]; inline int gcd(int m,int n){return n?gcd(n,m%n):m;} int fact[];
void calcfact()
{
fact[]=;
for(int i=;i<=;i++) fact[i]=fact[i-]*i;
} int main()
{
calcfact(); int t;
scanf("%d",&t);
memset(p,,sizeof(p));
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) for(int j=;j<=n;j++) scanf("%d",&p[i][j]); memset(dp,,sizeof(dp));
dp[][]=;
for(int sta=;sta<(<<n);sta++) //遍历所有状态
{
int cnt=; //cnt表示已经安排好了cnt道题目
for(int i=;i<=n;i++) if(sta&(<<(i-))) cnt++; for(int i=;i<=n;i++)
{
if( ( sta & (<<(i-)) ) == ) continue; for(int k=;k<=m;k++)
{
if(k+p[cnt][i]>=m) dp[sta][m]+=dp[sta^(<<(i-))][k];
else dp[sta][k+p[cnt][i]]+=dp[sta^(<<(i-))][k];
}
}
} if(dp[(<<n)-][m]==)
{
printf("No solution\n");
continue;
} int down=dp[(<<n)-][m];
int up=fact[n];
int g=gcd(up,down);
printf("%d/%d\n",up/g,down/g);
}
}

时间复杂度O(n2)+O(2nmn)+O(lg(n!)),显然在数据较大时,主要影响项是O(2nmn),根据数据规模(2^12)*12*500 ≈ 2e7,足够。

PS.自从上次做状压DP专题之后,很久没有再做状压DP的题目了,发现自己对状压DP的理解还是不够深刻,而且忘记地也很快,需要复习巩固。

ZOJ 3777 - Problem Arrangement - [状压DP][第11届浙江省赛B题]的更多相关文章

  1. ZOJ 3780 - Paint the Grid Again - [模拟][第11届浙江省赛E题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780 Time Limit: 2 Seconds      Me ...

  2. zoj3777 Problem Arrangement(状压dp,思路赞)

    The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward i ...

  3. ZOJ 3777 B - Problem Arrangement 状压DP

    LINK:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:有N(\( N <= 12 \))道题,排顺序 ...

  4. zoj 3777 Problem Arrangement(壮压+背包)

    Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial C ...

  5. 2014 Super Training #4 B Problem Arrangement --状压DP

    原题:ZOJ 3777  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:给每个题目安排在每个位置的value ...

  6. ZOJ 3781 - Paint the Grid Reloaded - [DFS连通块缩点建图+BFS求深度][第11届浙江省赛F题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 Time Limit: 2 Seconds      Me ...

  7. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  8. zoj 3777 Problem Arrangement

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意:给出n道题目以及每一道题目不同时间做的兴趣值,让你求出所有做题顺序 ...

  9. ZOJ 3723 (浙大月赛)状压DP

    A了一整天~~~终于搞掉了. 真是血都A出来了. 题目意思很清楚,肯定是状压DP. 我们可以联系一下POJ 1185  炮兵阵地,经典的状压DP. 两道题的区别就在于,这道题的攻击是可以被X挡住的,而 ...

随机推荐

  1. Laravel5.1 填充数据库

    当我们创建好表结构后 通常都要生成一些测试用的数据来测试,应对这个场景呢 Laravel提供了相当好的服务 --seed Laravel的seeder都会放在:/database/seeders 目录 ...

  2. MySql 错误 Err [Imp] 1153 - Got a packet bigger than 'max_allowed_packet' bytes

    今天在用Navicat导入SQL文件时报错:MySql 错误 Err [Imp] 1153 - Got a packet bigger than 'max_allowed_packet' bytes ...

  3. GSAP JS基础教程--使用缓动函数

    今天来了解一下缓动easeing函数. 开始,如果你还没有GSAP的类包,可以到GreenSock的官网去下载最新版本的类包,或者直接点击这里​来下载 学习之前,先来准备一下:     <!DO ...

  4. 一句话木马:ASP篇

    ASP一句话木马收集: <%eval request("chopper")%> <%execute request("chopper")%&g ...

  5. 第五篇:Hadoop流

    前言 Hadoop流提供了一个API,允许用户使用任何脚本语言编写Map函数或Reduce函数. 本文对此知识点进行介绍. Hadoop流的工作原理 在以前的例子中,Map和Reduce工作都是由类来 ...

  6. Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2

    原因是解析的时候多了,逗号,或是 \ 解决方法:一 revJson=revJson.replace("\\", "");//去掉'/' revJson=revJ ...

  7. N76E003之定时器3

    定时器3是一个16位自动重装载,向上计数定时器.用户可以通过配置T3PS[2:0] (T3CON[2:0])选择预分频,并写入重载值到R3H 和R3L寄存器来决定它的溢出速率.用户可以设置TR3 (T ...

  8. 【转】java:Session(会话)机制详解

    书中讲:以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate( ...

  9. shell 获取脚本的绝对路径

    basepath=$(cd `dirname $0`; pwd) 在此解释下basepath : dirname $0,取得当前执行的脚本文件的父目录 cd `dirname $0`,进入这个目录(切 ...

  10. Xcode debug时如何查看内存中的数据

    对于IPhone开发/XCode的初学者,如何在调试时查看变量的值是很头痛的事情.因为Xcode的expression 经常无法正确显示变量的值.但是强大的GDB可以很方便的帮我们查看变量的值.   ...