NYOJ 860 又见01背包

举报
Linux猿 发表于 2021/08/04 23:27:08 2021/08/04
【摘要】 题目链接~~> 做题感悟:这题是在做周赛时接触的,一看题目感觉很简单,又一看数据没法开数组,那就只有用搜索了,果断超时。 解题思路:因为价值最多才 1e4 所以可以把价值看成背包的容量,选的时候选重量轻的,之后再从最大价值开始遍历,只要重量满足就 break ; 代码: #include<stdio.h>const int INF =1e9+5 ;i...

题目链接~~>

做题感悟:这题是在做周赛时接触的,一看题目感觉很简单,又一看数据没法开数组,那就只有用搜索了,果断超时。

解题思路:因为价值最多才 1e4 所以可以把价值看成背包的容量,选的时候选重量轻的,之后再从最大价值开始遍历,只要重量满足就 break ;

代码:


  
  1. #include<stdio.h>
  2. const int INF =1e9+5 ;
  3. int w[105],v[105],dp[10005] ;
  4. int main()
  5. {
  6. int i,j,n,m ;
  7. while(scanf("%d%d",&n,&m)!=EOF)
  8. {
  9. int sum=0 ;
  10. for(i=0 ;i<n ;i++)
  11. {
  12. scanf("%d%d",&w[i],&v[i]) ;
  13. sum+=v[i] ; // 价值上限
  14. }
  15. dp[0]=0 ;
  16. for(i=1 ;i<=sum ;i++)
  17. dp[i]=INF ;
  18. for(i=0 ;i<n ;i++)
  19. for(j=sum ;j>=v[i] ;j--)
  20. if(dp[j]>dp[j-v[i]]+w[i])
  21. dp[j]=dp[j-v[i]]+w[i] ;
  22. for(j=sum ;j>=0 ;j--)
  23. if(dp[j]<=m)
  24. {
  25. printf("%d\n",j) ;
  26. break ;
  27. }
  28. }
  29. return 0 ;
  30. }


 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/18084857

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。