hdu5890(二维01背包+bieset优化)
2016-09-19 19:19
309 查看
链接:点击打开链接
题意:给出n个数和q次询问,每次删除1到3个数,问使否能从剩下的数中选10个数和为87
代码:
题意:给出n个数和q次询问,每次删除1到3个数,问使否能从剩下的数中选10个数和为87
代码:
#include <bitset> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int n,a[55],sign[55][55][55]; bitset<90> dp[11]; int judge(int x,int y,int z){ int i,j; for(i=1;i<=n;i++) dp[i].reset(); dp[0][0]=1; for(i=1;i<=n;i++){ //用bitset代替二维数组,可以 if(i!=x&&i!=y&&i!=z) //直接进行容量的转移 for(j=9;j>=0;j--) dp[j+1]|=(dp[j]<<a[i]); } if(dp[10][87]==1) return 1; return 0; } int main(){ int t,i,j,k,q,x,y,z; scanf("%d",&t); while(t--){ scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); memset(sign,0,sizeof(sign)); for(i=1;i<=n;i++){ //因为n只有50因此可以提前预处理出来 for(j=i;j<=n;j++){ //而且很明显是一个二维背包,但是复杂度 for(k=j;k<=n;k++){ //太高因此不能直接用二维背包求解 if(judge(i,j,k)){ sign[i][j][k]=sign[i][k][j]=1; sign[j][i][k]=sign[j][k][i]=1; sign[k][i][j]=sign[k][j][i]=1; } } } } scanf("%d",&q); while(q--){ scanf("%d%d%d",&x,&y,&z); if(sign[x][y][z]) puts("Yes"); else puts("No"); } } return 0; }
相关文章推荐
- leetcode 400. Nth Digit
- cocosCreate 黄金矿工绳索摆动,以及钩子的扔出和回收
- [ CodeVS冲杯之路 ] P3117
- Storage System and File System Courses
- char *a 与char a[] 的区别和char** argv与char *argv[]区别
- win64环境下sklearn的配置
- php的轻量级rpc框架yar
- GitHub与CocoaPods的使用
- 【effective c++】设计与声明
- 49. Group Anagrams
- input 的onChang失效问题
- Ubuntu16.04 操作
- HYSBZ 2243 染色 树链剖分 点上剖分
- python学习之 range,列表生成式与切片
- HDU 5887 Herbs Gathering 01背包+DFS搜索 *
- Mybatis插件原理分析(一)
- 【R语言】【Rstudio】中文支持
- unity使用代码修改Texture属性,一键生成精灵
- Mybatis插件原理分析(一)
- Mybatis插件原理分析(一)