HDU 1258 Sum It Up

举报
Linux猿 发表于 2021/08/05 00:19:32 2021/08/05
【摘要】 题目链接~~>                    开始时没想道怎样判重,后来想到用二维数组存一下一个值的所有组合,当前值如果再出现别的组合,先检查一下存入的是否有重复的,如果没有则输出,...

题目链接~~>

                   开始时没想道怎样判重,后来想到用二维数组存一下一个值的所有组合,当前值如果再出现别的组合,先检查一下存入的是否有重复的,如果没有则输出,否则不输出,然后检查下一个值时,如果与上一个组合过的值相同,那么只需要判断是否与上一个产生的组合有重复的。据说可以用哈希表判重。

代码:


  
  1. #include<stdio.h>
  2. #include<string.h>
  3. int n,m,p,sut,f ;
  4. int g[15],a[100][15],b[100],vis[15] ;
  5. void dfs(int cut,int sum)
  6. {
  7. int i ;
  8. if(sum==m)
  9. {
  10. int k=0,sx=0 ;
  11. for(i=0 ;i<n ;i++) // 先把找到的组合存储起来
  12. if(vis[i])
  13. a[p][k++]=g[i] ;
  14. b[p++]=k ;
  15. for(i=0 ;i<p-1 ;i++) //判断是否有重复的
  16. if(b[i]==k)
  17. {
  18. sx=1 ;
  19. for(int j=0 ;j<k ;j++)
  20. if(a[i][j]!=a[p-1][j])
  21. {
  22. sx=0 ;
  23. break ;
  24. }
  25. if(sx)
  26. break ;
  27. }
  28. if(!sx)
  29. {
  30. sut=1 ; // 标记是否有解
  31. for(i=0 ;i<k ;i++)
  32. if(!i)
  33. printf("%d",a[p-1][i]) ;
  34. else printf("+%d",a[p-1][i]) ;
  35. printf("\n") ;
  36. }
  37. else p-- ;
  38. return ;
  39. }
  40. if(cut==n)
  41. return ;
  42. for(i=cut ;i<n ;i++)
  43. if(g[i]+sum<=m&&!vis[i])
  44. {
  45. vis[i]=1 ;
  46. dfs(cut+1,g[i]+sum) ;
  47. vis[i]=0 ;
  48. }
  49. }
  50. int main()
  51. {
  52. int i ;
  53. while(scanf("%d %d",&m,&n)!=EOF)
  54. {
  55. if(!n)
  56. break ;
  57. int sm=0 ; sut=0 ; p=0 ;
  58. for(i=0 ;i<n ;i++)
  59. {
  60. scanf("%d",&g[i]) ;
  61. sm+=g[i] ;
  62. }
  63. printf("Sums of %d:\n",m) ;
  64. for(i=0 ;i<n ;i++)
  65. {
  66. if(sm<m)
  67. break ;
  68. memset(vis,0,sizeof(vis)) ;
  69. f=0 ;
  70. if(i!=0&&g[i]!=g[i-1])
  71. p=0 ;
  72. sm-=g[i] ; vis[i]=1 ;
  73. dfs(i+1,g[i]) ;
  74. }
  75. if(!sut)// sut==0 表示无解
  76. printf("NONE\n") ;
  77. }
  78. return 0 ;
  79. }


 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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