UVA 624 - CD (01背包打印路径)

举报
Linux猿 发表于 2021/08/05 00:11:49 2021/08/05
【摘要】 题目链接~~> 做题感悟:本来以为就一种结果搞了好久没搞定,然后用前天看的01背包打印路径的方法,但是必须用二维的数组果断超时,因为没看到第一维只有20!!。 解题思路:这题属于价值和重量相等的01背包问题,只是题目还要求输出路径(只要输出一种即可)。 代码: #include<stdio.h>#include<string.h>int ...

题目链接~~>

做题感悟:本来以为就一种结果搞了好久没搞定,然后用前天看的01背包打印路径的方法,但是必须用二维的数组果断超时,因为没看到第一维只有20!!。

解题思路:这题属于价值和重量相等的01背包问题,只是题目还要求输出路径(只要输出一种即可)。

代码:


  
  1. #include<stdio.h>
  2. #include<string.h>
  3. int dp[10005],w[10005] ;
  4. bool path[25][10005] ; // 路径记录
  5. int main()
  6. {
  7. int i,j,n,m ;
  8. while(scanf("%d%d",&m,&n)!=EOF)
  9. {
  10. for(i=0 ;i<n ;i++)
  11. scanf("%d",&w[i]) ;
  12. memset(path,false,sizeof(path)) ;
  13. memset(dp,0,sizeof(dp)) ;
  14. for(i=n-1 ;i>=0 ;i--) // i从n到0便于打印路径
  15. for(j=m ;j>=w[i] ;j--)
  16. if(dp[j]<dp[j-w[i]]+w[i])
  17. {
  18. dp[j]=dp[j-w[i]]+w[i] ;
  19. path[i][j]=true ;
  20. }
  21. j=m ;
  22. for(i=0 ;i<n ;i++) // 打印路径
  23. if(path[i][j])
  24. {
  25. printf("%d ",w[i]) ;
  26. j-=w[i] ;
  27. }
  28. printf("sum:%d\n",dp[m]) ;
  29. }
  30. return 0 ;
  31. }

代码:


  
  1. #include<stdio.h>
  2. #include<string.h>
  3. int dp[25][10005],w[10005] ;
  4. int main()
  5. {
  6. int n,m,i,j ;
  7. while(scanf("%d%d",&m,&n)!=EOF)
  8. {
  9. for(i=1 ;i<=n ;i++)
  10. scanf("%d",&w[i]) ;
  11. memset(dp,0,sizeof(dp)) ; // 一定要有
  12. for(i=n ;i>=1 ;i--)
  13. for(j=0 ;j<=m ;j++)
  14. {
  15. dp[i][j]=(i==n ? 0 : dp[i+1][j]) ;
  16. if(j>=w[i]&&dp[i][j]<dp[i+1][j-w[i]]+w[i])
  17. dp[i][j]=dp[i+1][j-w[i]]+w[i] ;
  18. }
  19. j=m ;
  20. for(i=1 ;i<=n ;i++)
  21. if(dp[i][j]>dp[i+1][j])
  22. {
  23. printf("%d ",w[i]) ;
  24. j-=w[i] ;
  25. }
  26. printf("sum:%d\n",dp[1][m]) ;
  27. }
  28. return 0 ;
  29. }



 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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