之前做过一道题“破锣摇滚乐队”,把猫都编了号,每辆车只能装一些编号递增的猫,而且前一辆车的猫编号都比后一辆车小。那道题的DP状态是:f[i][j]表示装了前i只猫,使用了j辆车时第j辆车所剩空间的最大值。转移时,考虑第i只猫是新坐一辆车(从f[i-1][j-1]转移)还是坐第j辆车剩下的空位(从f[i-1][j]转移),当然要从某个子状态转移过来,必须保证这个子状态是存在的(f[i][j]存在就是说j辆车能够塞下前i只猫)

这个题,没有顺序的限制,所以无法直接套用那道题的状态。但n<=18,可以状态压缩。f[S][j]表示集合S中的猫坐在前j辆车中时,第j辆车剩下的最大空间。转移时枚举S中每一只猫即可。(不妨认为我们是从第一辆车开始依次装猫,装到第j辆的时候前面j-1辆车就不再考虑了)。最后从小到大找可行状态。

不过状态总数高达18*2^18,状态转移需要O(n),也就是说,总的时间复杂度为18*18*2^18,好虚....所幸,这个方法的特点是:对于相同的n,任何输入的循环次数相同,所以我在自己的电脑上随便造了一组n=18的数据。测试结果表明,1s内完全可以出解,所以就放心交上去了2333。确实能过,不过时间被搜索虐爆了....

#include<cstdio>
#include<cstring>
#include<ctime>
int f[1<<18][19];//about 5 Mib
int a[20];
int max(int a,int b){
return a>b?a:b;
}
int main(){
// double t1=clock();
int n,w;scanf("%d%d",&n,&w);
for(int i=0;i<n;++i)scanf("%d",a+i);
int lim=1<<n;
memset(f,0xc2,sizeof(f));//初始化-inf
f[0][0]=0;
for(int i=1;i<lim;++i){
for(int k=1;k<=n;++k){
for(int j=0;j<n;++j){
if(i&(1<<j)){
if(f[i^(1<<j)][k]>=a[j])f[i][k]=max(f[i][k],f[i^(1<<j)][k]-a[j]);
if(f[i^(1<<j)][k-1]>=0)f[i][k]=max(f[i][k],w-a[j]);
}
}
}
}
for(int i=1;i<=n;++i){
if(f[lim-1][i]>=0){
printf("%d\n",i);
break;
}
}
// double t2=clock();
// printf("%.3fs\n",(t2-t1)/CLOCKS_PER_SEC);
return 0;
}

  

最新文章

  1. MapleSim助力长臂挖掘机建模问题解决
  2. js的一点
  3. 自定义Cell的方法
  4. JAVA volatile 关键字
  5. 设计模式之Singleton
  6. sqlserver 用户、账号、安全等问题小汇
  7. Maven使用笔记(七)Maven使用问题记录
  8. [读书笔记]项目管理实战:Microsoft Project精髓与方法
  9. Bit data type
  10. lesson2:java阻塞队列的demo及源码分析
  11. 【iOS】用Layer创建一个三维模型以及拖动
  12. 在JavaScript中也玩变量类型强行转换
  13. 4.windows和Linux下创建oracleusername表空间,表,插入数据,用户管理表等操作
  14. PowerShell:因为在此系统上禁止运行脚本
  15. tp框架 :操作数据库
  16. NEFU_117素数个数的位数
  17. 【Teradata】TD Unicode编码格式下varchar定义测试
  18. JAVA自学笔记18
  19. Mininet自定义网络拓扑
  20. css z-index之object flash层级问题

热门文章

  1. CentOs下jdk的安装
  2. Qt学习笔记 ListWidget的增删改
  3. Servlet学习之web服务器Tomcat 详解
  4. web文档在线阅览
  5. Windows8.1画热度图 - 坑
  6. js下拉框
  7. 【Spring3.0系列】---Bean不同配置方式比较 和适用场合
  8. 在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解
  9. CAP理论
  10. sql insert into select语句写法-将查询结果直接插入到表中