ZOJ-3777 Problem Arrangement(dp状态压缩)

原创 2016年05月30日 10:54:14

dp[i][j],若i中有temp个1则表示为前temp个物品已选好位置,且他们的位置情况用i的二进制位表示.j表示在i情况下达到intersting value值为j是的选法个数。

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#include <stack>
#include <queue>
#define maxn 40005
#define INF 1e17
using namespace std;
typedef long long ll;

ll dp[1<<13][505];
int num[13][13];
ll gcd(ll a, ll b){
    return b ? gcd(b, a % b) : a;
}
int main(){

//  freopen("in.txt", "r", stdin); 
    int t;

    scanf("%d", &t);
    while(t--){

        int n, m;
        scanf("%d%d", &n, &m);
        for(int i = 0; i < n; i++)
          for(int j = 0; j < n; j++)
           scanf("%d", &num[i][j]);
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;
        for(int i = 0; i < (1<<n); i++){    
            int temp = 0;
            for(int j = 0; j < n; j++){
                if(i & (1<<j))
                  temp++;
            }
            for(int j = 0; j < n; j++){
                if(i & (1<<j))
                  continue;
                for(int h = 0; h <= m; h++)
                  if(h + num[temp][j] >= m)
                   dp[i+(1<<j)][m] += dp[i][h];
                  else
                   dp[i+(1<<j)][h+num[temp][j]] += dp[i][h];
            } 
        } 
        ll p = 1;
        for(int i = 1; i <= n; i++)
         p *= i;
        if(dp[(1<<n)-1][m] == 0)
          cout << "No solution" << endl;
        else{
            ll d = gcd(dp[(1<<n)-1][m], p);
            cout << p/d << "/" << dp[(1<<n)-1][m]/d << endl; 
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

zoj-3777-Problem Arrangement(状态压缩DP)

思路来源:http://blog.csdn.net/u013081425/article/details/23677585

zoj3777 Problem Arrangement(状态压缩dp)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:给出n道题目以及每一道题目不同时间做的兴趣...

ZOJ3777 Problem Arrangement 期望+状态压缩+meet in the middle中途相遇法

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

zoj 3777(状态压缩dp)

// 题意:求一个长度为n的序列 所有的排列组成的疲劳值大于m的数量 // 也就是求一个矩阵每行每列只能取一个得到的所有数字大于m共有多少种 // n最大为12 m最大为500 所以采用状态压缩 //...

zoj 3777【状态压缩dp】

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:有n到题目,当第i到题目放在第j个位置...
  • t51645
  • t51645
  • 2017年04月13日 00:00
  • 96

ZOJ 3777 Problem Arrangement (状压DP)

分析:题目要求数学期望,其实就是求最终值≥M\ge{M}的概率。暴力的做法:找出所有排列方式,一个一个找:o(12!)o(12!),贵了。对数据敏感的话,应该比较容易想到状压。 dp[i][msk]...

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

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

ZOJ3777 - Problem Arrangement(状压DP)

题目链接:https://cn.vjudge.net/problem/ZOJ-3777题目大意:现在有一个N×N的矩阵,现在要求在这个矩阵里面取N个来自不同行不同列的数,使这个数大于给定的M。求总共有...

ZOJ 3777 - Problem Arrangement(状压DP)

题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意: 给出n*n的矩阵,从中选出n个数,任意两个数在不同...

【ZOJ3777】Problem Arrangement(状压dp)

题目链接 题目大意: 有n道题,第i道题放在第j个有价值PijP_{ij} 有T组数据。 有n道题,给你一个价值m。 问有多少种方案使得总价值大于等于m。 输出方案数/总数(分数最简) ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZOJ-3777 Problem Arrangement(dp状态压缩)
举报原因:
原因补充:

(最多只允许输入30个字)