题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数。

分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法:

1.组合解决:

代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;int n,sum1,sum2,a[15];
int st1[1500],st2[1500],st[1500],num1,num2,num;
int total[1500],all;
//st1数组保存的是第一辆车能够一次运走的所有状态,同理st2数组为第二辆车的
//st数组保存的是两辆车一次能够运走的所有状态
void dfs(int f,int flag,int x,int s)//开始的时候这个dfs是作死的错,说明dfs写得还不够熟练
{int i,j,temp;if(flag==1&&f==n+1)st1[num1++]=x;else if(f==n+1)st2[num2++]=x;if(f>n) return ;temp=1<<(n-f);if(flag==1){if(s+a[f]<=sum1)dfs(f+1,flag,x+temp,s+a[f]);dfs(f+1,flag,x,s);}else{if(s+a[f]<=sum2)dfs(f+1,flag,x+temp,s+a[f]);dfs(f+1,flag,x,s);}
}void hebing()//两辆车的状态合并
{int i,j,t=2;int visited[1500],temp;memset(visited,0,sizeof(visited));for(i=1;i<num1;i++)for(j=1;j<num2;j++){temp=st1[i]|st2[j];if(visited[temp]==0){st[num++]=temp;visited[temp]=1;}}
}void solve(int T)//我这里是用组合解决的,虽然提交了之后发现用组合比用背包时间还少
{                //但是觉得可能是测试数据的原因,个人觉得还是背包靠谱些printf("Scenario #%d:\n",T);int temp[1500],t,res=0,x;int i,j,max=0,flag=0;int visited[1500];all=2;total[1]=0;for(i=1;i<=n;i++)max=max+(1<<(i-1));while(1){res++;t=1;memset(visited,0,sizeof(visited));for(i=1;i<all;i++){// int kao=0;//kao++;for(j=1;j<num;j++){x=(total[i]|st[j]);if(x==max){flag=1;break;}if(visited[x]==0){visited[x]=1;temp[t++]=x;}}if(flag==1)break;}if(flag==1)break;for(i=1;i<t;i++)total[i]=temp[i];all=t;}printf("%d\n",res);
}int main()
{int i,T,t;scanf("%d",&T);for(t=1;t<=T;t++){num1=1;num2=1;num=1;scanf("%d%d%d",&n,&sum1,&sum2);for(i=1; i<=n; i++)scanf("%d",&a[i]);dfs(1,1,0,0);dfs(1,2,0,0);hebing();solve(t);if(t!=T)printf("\n");}return 0;
}

2.背包解决:
代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;int n,sum1,sum2,a[15];
int st1[1500],st2[1500],st[1500],num1,num2,num;
int total[1500],all;void dfs(int f,int flag,int x,int s)
{int i,j,temp;if(flag==1&&f==n+1)st1[num1++]=x;else if(f==n+1)st2[num2++]=x;if(f>n) return ;temp=1<<(n-f);if(flag==1){if(s+a[f]<=sum1)dfs(f+1,flag,x+temp,s+a[f]);dfs(f+1,flag,x,s);}else{if(s+a[f]<=sum2)dfs(f+1,flag,x+temp,s+a[f]);dfs(f+1,flag,x,s);}
}void hebing()
{int i,j,t=2;int visited[1500],temp;memset(visited,0,sizeof(visited));for(i=1;i<num1;i++)for(j=1;j<num2;j++){temp=st1[i]|st2[j];if(visited[temp]==0){st[num++]=temp;visited[temp]=1;}}
}int Min(int x,int y)
{return x>y?y:x;
}void solve(int T)
{printf("Scenario #%d:\n",T);int i,j,dp[1500];for(i=1;i<(1<<n);i++)dp[i]=100000000;dp[0]=0;for(i=1;i<num;i++){for(j=(1<<n)-1;j>=0;j--){if(dp[j]==100000000)continue;if((j&st[i])==0)dp[j|st[i]]=Min(dp[j|st[i]],dp[j]+1);}}printf("%d\n",dp[(1<<n)-1]);
}int main()
{int i,T,t;scanf("%d",&T);for(t=1;t<=T;t++){num1=1;num2=1;num=1;scanf("%d%d%d",&n,&sum1,&sum2);for(i=1; i<=n; i++)scanf("%d",&a[i]);dfs(1,1,0,0);dfs(1,2,0,0);hebing();solve(t);if(t!=T)printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/jiangjing/p/3450198.html

poj 2923(状态压缩dp)相关推荐

  1. poj 3797(状态压缩dp)

    题意:4*n的木板,用1*2方块去贴,问一共有多少种方案. 解题思路:这道题是简单的状态压缩,和之前的铺方块是一样的思路,横着的为全1,如果有空格等着下一行去铺就置0,那么下一行的这个位置肯定为1,因 ...

  2. POJ 3254 状态压缩DP

    我的状态压缩的第一题,忘记取模错了2次. 符合的状态000 001 010 100 101  记得和该行原来状态看是否符合. #include<cstdio> #include<io ...

  3. poj 2288(状态压缩dp + TSP问题)

    题目描述:哈密尔顿路问题.n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每一个点的权值之和 2.对于图中的每一条CiCi+1,加 ...

  4. poj 2923(状态压缩+背包)

    比较巧妙的一道题目,拿到题目就想用暴力直接搜索,仔细分析了下发现复杂度达到了2^n*n! ,明显不行,于是只好往背包上想. 于是又想二分找次数判断可行的方法,但是发现复杂度10^8还是很悬... 然后 ...

  5. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  6. 状态压缩dp入门 第一题 POJ 3254 Corn Fields

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6460   Accepted: 3436 Descr ...

  7. POJ 2411 Mondriaan's Dream(状态压缩DP)

    题目链接 早就见过这个题,开始以为有公式的,推了几次没推出,后来知道这个题是状态压缩DP.最近开始看状态压缩,本想试着解出来,但是这个比那个牛吃草复杂多了...位运算还是不是很熟练,这个题的解题报告有 ...

  8. jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】

    正题 POJ链接:http://poj.org/problem?id=1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https: ...

  9. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

最新文章

  1. 限制TextBox的长度
  2. [BZOJ4766]文艺计算姬
  3. amd支持嵌入式linux,AMD 发布针对 Linux 的 Radeon Software 19.30,支持Radeon RX 5700
  4. Asp.Net中替代Eval的两种方式
  5. OS中atomic的实现解析
  6. 【图像处理】——图像特效处理(马赛克、图像融合、毛玻璃等)
  7. Drools:基于PHREAK堆栈的评估和向后链接
  8. 工作342:消除平时环境的console
  9. python choose语句作用_理解闭包是如何与变量作用域相互影响的
  10. IDEA集成Scala图文教程详细步骤
  11. java抽取注释_JAVA 注解教程(五)注解的提取
  12. quartus仿真系列1:74163的计数功能
  13. MOSFET(三):电源缓启动
  14. 戴文的Linux内核专题:22 配置内核 (18)
  15. python chardet模块_python编码检测原理以及chardet模块应用
  16. python外包凹多边形生成_用Opencv python裁剪图像中的凹多边形
  17. 向日葵远程软件连接Ubuntu无法显示桌面之解决方案
  18. 网页显示mysql数据库到表格数据_html表格显示数据库数据
  19. masOS上使用Java 3D解决方案
  20. 数据分析之Pandas(三):汇总、统计、相关系数和协方差

热门文章

  1. Android移动开发之【Android实战项目】DAY7-项目结构
  2. 回归插补法_用均值替换、 回归插补及多重插补进行插补
  3. 比较好用的python编译器_10个最好用的在线编译工具
  4. uvc音频传输协议_蓝牙中的三种音频编码:Apt-X、SBC、AAC,请问分别有什么区别?...
  5. python最终目标是什么_Python之父Guido谈Python的未来
  6. 进阶学习(3.6) Prototype Pattern 原型模式
  7. 网络推广期间发现网站快照更新过慢会影响正常网络推广吗?
  8. java实现上传功能吗_Java实现文件上传功能
  9. office移动端_微软手机端三合一Office APP开启公测,大家可以下载试试
  10. python3打开文件的代码_Python3 对文件操作