zoj3777(状态压缩)

题目阐述:

给定n个座位,n个人,每个人可以做n个位置中的任意一个,P[i][j]代表第i个人做第j个位置获得的分数,求有多少种排列方式使得获得的分数大于等于M。

这道题跟数位dp的思想很像,都是穷举可能的方式,不过数位DP由于前缀的影响可以记忆化,这道题由于n较小,可以直接状态压缩.

定义状态d[i][s][t]代表已经放了i个座位,放的人数集合为s,获得分数为t的排列的数量。

然后每次暴力枚举每个位置可能会放的人

d[i][s | (1 << j)][t+ p[j][i]] +=d[i-1] [s] [t];

重点是如何实现:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define maxn 13
using namespace std;
int d[1<<(maxn)][505]; //表示到达状态s时产生的最大能量
int n,m;
int P[maxn][maxn];
int ans;
void init()
{ans=0;memset(d,0,sizeof(d));
}
//GCD
//求最大公约数
//O(logn)
int gcd(int a, int b)
{if (b == 0)return a;elsereturn gcd(b, a%b);
}
int isok(int i)
{int t=0;while(i){if(i&1) t++;i>>=1;}return t;
}
void solve()
{int tot=(1<<n)-1;d[0][0]=1; //其实可以理解成d[-1][0][0],否则下面就需要特殊处理i等于0for(int i=0;i<n;i++)   //代表第i个位置
     {for(int s=0;s<=tot;s++)  //遍历所有状态
            {if(isok(s)!=i)   continue ;//检测哪些是前i-1个位置的状态for(int t=0;t<=m;t++)  //遍历所有获得的分数
                    {if(!d[s][t])  continue; //检测哪些是前i-1个位置获得的分数for(int j=0;j<n;j++)  //枚举第i个位置可能放的人
                     {if( s & (1<<j) ) //检测前i-1个位置是否放过continue;int state= s | (1<<j);int MM=min(m,t+P[j][i]);d[state][MM]+=d[s][t];}}}}ans=d[tot][m];
}int main()
{// freopen("test.txt","r",stdin);int fac[maxn];fac[0]=1;for(int i=1;i<maxn;i++)fac[i]=fac[i-1]*i;int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i=0;i<n;i++)for(int j=0;j<n;j++){scanf("%d",&P[i][j]);}solve();int d = gcd(fac[n], ans);if (ans == 0)printf("No solution\n");elseprintf("%d/%d\n", fac[n]/d, ans/d);}return 0;
}

bfs实现:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#define maxn 13
using namespace std;
int d[1<<(maxn)][505]; //表示到达状态s时产生的最大能量
int n,m;
int P[maxn][maxn];
int ans;
int gcd(int a, int b)
{if (b == 0)return a;elsereturn gcd(b, a%b);
}int bit(int i)
{int t=0;while(i){if(i&1) t++;i>>=1;}return t;
}
struct node
{int s,t,cnt=0;
};
int  visit[1<<maxn][505];
void   bfs()
{queue  < node > que;memset(visit,0,sizeof(visit));int tot=(1<<n)-1;node start,last;start.s=0; start.t=0;start.cnt=0;que.push(start);visit[start.s][start.t]=1;d[0][0]=1;while(!que.empty()){node cur=que.front();que.pop();for(int i=0;i<n;i++){if(cur.s & (1<<i))continue;node next  ;next.s= cur.s | (1<<i);next.cnt=cur.cnt+1;next.t= min(m,cur.t+P[i][cur.cnt]); //将第i个人放在当前位置,然后才会加1d[next.s][next.t] += d[cur.s][cur.t];if(visit[next.s][next.t])  //保证只进队一次continue;que.push(next);visit[next.s][next.t]=1;}}ans=d[tot][m];
}int main()
{// freopen("test.txt","r",stdin);int fac[maxn];fac[0]=1;for(int i=1;i<maxn;i++)fac[i]=fac[i-1]*i;int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);ans=0;memset(d,0,sizeof(d));;for(int i=0;i<n;i++)for(int j=0;j<n;j++){scanf("%d",&P[i][j]);}bfs();int d = gcd(fac[n], ans);if (ans == 0)printf("No solution\n");elseprintf("%d/%d\n", fac[n]/d, ans/d);}return 0;
}

 

转载于:https://www.cnblogs.com/xianbin7/p/4780565.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 你最不喜欢React的哪一个特性(说一个就好)?

[react] 你最不喜欢React的哪一个特性&#xff08;说一个就好&#xff09;&#xff1f; 受控组件&#xff08;input、radio、textarea&#xff09;写起来始终难受&#xff0c;没有像vue的v-model之类的语法糖 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放…

Fedora 15 快捷操作之新体验

From: http://www.linuxdiyf.com/bbs/viewthread.php?tid202449&extra 由于Fedora采用了默认的Gnome3&#xff0c;所以桌面环境与以往的版本有很大的不同&#xff0c;比如说右上角没有关机选项卡&#xff0c;需要你按下Alt键就会发现&#xff0c;挂起变成了关机&#xff…

Qt MQTT安装步骤记录

QT中的MQTT作为第三方库需要自己安装才能使用&#xff0c;以下简单记录方法。 一、下载MQTT源码编译成连接库 github地址&#xff1a; https://github.com/qt/qtmqtt 二、新建QtMqtt文件夹并拷贝MQTT头文件 2.1 在mingw53_32\include中新建QtMqtt文件夹 2.2 拷贝源码中的所有…

巧分十九头牛

从前&#xff0c;有一位姓李的农夫&#xff0c;他有三个儿子&#xff0c;大儿子和二儿子都结了婚&#xff0c;自立了门户。小儿子是跟他生活在一起的&#xff0c;至今没有还没有说亲。      李老头的老伴于三年前离开了人世。他做梦没想到老伴请他去做伴&#xff0c;觉得自…

算法学习之选择排序

选择排序&#xff0c;就是选择最小的&#xff0c;然后置换&#xff0c;循环再找到最小的&#xff0c;再置换... 1 package com.swust.插入排序;2 3 import java.util.Random;4 5 public class Example1 {6 public static void main(String[] args) {7 int[] arrnew…

Qt 解决 #error This file requires compiler and library support for the ISO C++ 2011 standard

一、Qt编译过程中&#xff0c;出现以下问题#error This file requires compiler and library support for the ISO C 2011 standard. This support is currently experimental, and must be enabled with the -stdc11 or -stdgnu11 compiler options.意思是缺乏c11的支持。二、…

Adobe FLASH CS3快捷键(时间轴常用)

From: http://blog.sina.com.cn/s/blog_4b5506750100ci3y.html 下面发几个时间轴常用快捷键&#xff0c; 记住了在做的当中能提升很多速度。 【时间轴】 &#xff08;M) 【删除帧】 &#xff08;R) ShiftF5 【剪切帧】 &#xff08;T) CtrlAltX 【复制…

zabbix的rc控制脚本

zabbix在freebsd的rc启动控制脚本&#xff0c; 拷贝如下内容到/usr/local/etc/zabbix_ctl&#xff0c;并且修改权限为可执行&#xff1a; #!/bin/sh umask 022 CAT/bin/cat KILL/bin/kill SU_USERzabbix # zabbix script ZABBIX_SERVER/usr/local/sbin/zabbix_server …

[react] 使用webpack打包React项目,怎么减小生成的js大小?

[react] 使用webpack打包React项目&#xff0c;怎么减小生成的js大小&#xff1f; 打包优化的问题解决思路&#xff1a; 代码压缩&#xff1a;UglifyjsWebpackPlugin代码分组 commonsChunkPlugin, SplitChunksPlugin网络传输压缩gzip: CompressionWebpackPlugin抽取css代码&am…

项目中通用的顶部标题和返回的TitleBar

1. 定义布局文件&#xff0c;在layout下新建title_bar_view.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"a…

华为ECS云服务器 Ubuntu 安装和配置FTP教程

折腾了一下在云服务器上搭建FTP&#xff0c;可以在浏览器输入公网IP查看共享的文件&#xff0c;也就是创建下载点。现记录如下。第一种场景&#xff1a;匿名访问&#xff0c;通过浏览器输入公网地址即可实现下载第二种场景&#xff1a;输入指定的用户名和密码&#xff0c;可进入…

Flash基本概念和原理

From: http://www.flashkj.com/wap.asp?actView&id66 一、时间轴线&#xff08;Timeline&#xff09; 时间轴线是动画和视频类软件中的一个重要概念。它相当于电影导演使用的摄影表。在实际电影拍摄中&#xff0c;导演通过摄影表来记录和控制整个影片的流程&#xff0c;包…

[react] React根据不同的环境打包不同的域名?

[react] React根据不同的环境打包不同的域名&#xff1f; 如果是CRA的项目的话&#xff0c;可以使用.env .env.development .env.production文件来区分不同的环境&#xff1b; 比如生产环境域名http://www.prod.com&#xff0c;开发环境域名http://www.deve.com&#xff0c; 则…

关于郭安定 - 了解我更多

谢谢您访问我的博客&#xff0c;我在 51CTO 的博文只是我个人在生活中有关计算机的感触或想法&#xff0c;有些观点可能考虑尚未周全&#xff0c;但记录心得可以使我成长和成熟&#xff0c;请大家拍砖时小力点。以下是我的自我介绍&#xff0c;更多了解可以关注我的新浪微博 –…

无线网络共享到CM3计算板调试时 connect: Network is unreachable

1、问题描述 硬件连接&#xff1a;电脑&#xff08;有线无线&#xff09; <--有线--> CM计算板&#xff08;或其他Linux&#xff09;&#xff0c; 端口&#xff1a;电脑共享的有线网口 192.168.137.1 &#xff0c; CM3配置静态IP 192.168.137.120/24 CM3ping 不通&am…

AS3读取XML文档

我用的开发工具是&#xff1a;Flash Professional CS5.5 新建一个AS3项目&#xff0c;保存fla文件为:f1.fla&#xff0c;另新建一个as3文件&#xff0c;文件名&#xff1a;Main.as&#xff0c;代码如下&#xff1a; package {import flash.display.MovieClip;import flash.ne…

哈密顿路径

哈密顿路径 #include <iostream>using namespace std;struct Graph{int vertexs;int **adj; };struct Edge{int v;int w; };void GraphInit(Graph* G, int v) {G->vertexs v;G->adj new int*[v];for (int i 0; i < v; i)G->adj[i] new int[v];for (int i…

[react] 你阅读了几遍React的源码?都有哪些收获?你是怎么阅读的?

[react] 你阅读了几遍React的源码&#xff1f;都有哪些收获&#xff1f;你是怎么阅读的&#xff1f; 0遍 1 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

CM3计算板读取SHT30以及I2C驱动

1、引言 用SHT30测温湿度&#xff0c;SHT30是I2C通信总线&#xff0c;具体信息去看Datasheet文档&#xff1a;https://pdf1.alldatasheet.com/datasheet-pdf/view/897974/ETC2/SHT30.html。操作系统是Linux&#xff0c;机器是CM3计算板&#xff0c;当然也可以是树莓派和其他主…

由浅入深CIL系列:5.抛砖引玉:判断string是否为空的四种方法的CIL代码看看效率如何?...

本节将接触几个新的CIL操作码如下 ldc.i4.0 将整数值 0 作为 int32 推送到计算堆栈上 Ceq 比较两个值。如果这两个值相等&#xff0c;则将整数值 1 (int32) 推送到计算堆栈上&#xff1b;否则&#xff0c;将 0 (int32) 推送到计算堆栈上。 Brtrue.s 如果 value 为…