博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
砝码称重
阅读量:4331 次
发布时间:2019-06-06

本文共 1619 字,大约阅读时间需要 5 分钟。

其实正解就是\(dfs+DP\)

但是因为自己写的不够好,再加上没有判断好\(DP\)的复杂度,导致\(T\)了好几次。

错点还是有的:

  • 1.多测不清空,爆零两行泪
  • 2.0的情况不行,不要以为\(i\)从1开始枚举就可以了。万一之后枚举到的数只有1个1,且这个1对应的位置是被标记删除的位置,又出现了1。

题解里还有一种神奇的优化\(DP\),的方法,但是加上就会莫名\(RE\)

学习\(dfs\)的写法:

#include
#include
#include
using namespace std;int n,m,a[55],ans,sumt;bool book[2005],sum[50005];/*void print(){ memset(sum,0,sizeof(sum)); int anst=0; for(int i=1;i<(1<<(n+1));i++) { int ansm=0; for(int j=1;j<=n;j++) if(i&(1<<(j-1))&&!book[j]) ansm+=a[j]; if(!sum[ansm]&&ansm!=0) ++anst; sum[ansm]=1; } ans=max(ans,anst);}*/void print(){ memset(sum,0,sizeof(sum)); int anst=0; sum[0]=1; for(int i=1;i<=n;i++) if(!book[i]) { for(int j=sumt-a[i];j>=0;j--) { if(sum[j]) { if(!sum[j+a[i]]) ++anst; sum[j+a[i]]=1; } } } ans=max(ans,anst);}void dfs(int t,int u){ if(t>=m) { print(); return ;} if(u>n) return ; dfs(t,u+1); book[u]=1; dfs(t+1,u+1); book[u]=0;/* for(int i=1;i<=n;i++) if(!book[i]) { book[i]=1; dfs(t+1); book[i]=0; }*/}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]),sumt+=a[i]; if(m==0) { print(); printf("%d\n",ans); return 0; } if(m==1) { for(int i=1;i<=n;i++) { book[i]=1; print(); book[i]=0; } printf("%d\n",ans); return 0; } dfs(0,1); printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/karryW/p/11552734.html

你可能感兴趣的文章
thinkphp3.2.3入口文件详解
查看>>
POJ 1141 Brackets Sequence
查看>>
Ubuntu 18.04 root 使用ssh密钥远程登陆
查看>>
Servlet和JSP的异同。
查看>>
虚拟机centOs Linux与Windows之间的文件传输
查看>>
ethereum(以太坊)(二)--合约中属性和行为的访问权限
查看>>
IOS内存管理
查看>>
middle
查看>>
[Bzoj1009][HNOI2008]GT考试(动态规划)
查看>>
Blob(二进制)、byte[]、long、date之间的类型转换
查看>>
OO第一次总结博客
查看>>
day7
查看>>
iphone移动端踩坑
查看>>
vs无法加载项目
查看>>
Beanutils基本用法
查看>>
玉伯的一道课后题题解(关于 IEEE 754 双精度浮点型精度损失)
查看>>
《BI那点儿事》数据流转换——百分比抽样、行抽样
查看>>
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>