nyoj 1091 还是01背包

先说一下做这道题的感悟,之前把nyoj背包题A的只剩这道题,一看这道题w,v限制那么大,用背包肯定不行,一看n<=40,果断深搜,交了一发,TLE,嗯嗯,的确,自己写了几组数据,当n=20的时候还阔以秒出答案,当n=25的时候会卡一下,当n=30的时候,愣了好几秒还没出,当n=40的时候,根本出不来,百度了一下,说是要折半枚举,看起来好麻烦的样子,看了下运行结果ac的人,基本上全是0ms,4ms,惊呆了。。。。看了讨论区才知道,原来深搜的时候,可以判断下剩下的能否全部装下,若能的话,就将剩下的全部装进去,自己小改了一发,一交果断ac,4ms,后台真水~~估计后台是全部都能装下,不过也算优化了。

代码贴上:

01. #include<stdio.h>
02. #define max(a,b) a>b?a:b
03. long long w[50],v[50],s=0,n,m,shengw[50],shengv[50];
04. void dfs(int ci,long long zongw,long long zongv )
05. {
06. int i,f=0;
07. if(zongw+shengw[n-1]-shengw[ci-1]<=m)
08. zongv+=shengv[n-1]-shengv[ci-1],f=1;
09. if(zongw<=m)
10. s=max(s,zongv);
11. if(!f)
12. for(i=ci; i<n; i++)
13. {
14. zongv+=v[i];
15. zongw+=w[i];
16. dfs(i+1,zongw,zongv);
17. zongv-=v[i];
18. zongw-=w[i];
19. }
20. }
21. int main()
22. {
23. while(scanf("%lld%lld",&n,&m)!=EOF)
24. {
25. int i;
26. for(i=0; i<n; i++)
27. scanf("%lld%lld",&w[i],&v[i]);
28. shengw[0]=w[0],shengv[0]=v[0];
29. for(i=1; i<n; i++)
30. shengw[i]=shengw[i-1]+w[i],shengv[i]=shengv[i-1]+v[i];
31. s=0;
32. dfs(0,0,0);
33. printf("%lld\n",s);
34. }
35. }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值