ZOJ 3703 Happy Programming Contest

举报
Linux猿 发表于 2021/08/04 23:39:25 2021/08/04
【摘要】 题目链接~~> 做题感悟:这题比赛时想了好久才做出来,赛后一想其实就是 01 背包一下,记录各个体积的最优值就可以了,比赛时想多了。 解题思路:                我直接开的二维数组 dp[ i ] [ j ]  代表达到体积 i ,做了 j 道题所达到的最优状...

题目链接~~>

做题感悟:这题比赛时想了好久才做出来,赛后一想其实就是 01 背包一下,记录各个体积的最优值就可以了,比赛时想多了。

解题思路:

               我直接开的二维数组 dp[ i ] [ j ]  代表达到体积 i ,做了 j 道题所达到的最优状态 : dp[ i ] [ j ]  = { dp [ i - v ] [ j - 1 ] } 的最优值 ,其实就是二维的背包 。

代码:


  
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<algorithm>
  6. using namespace std ;
  7. #define INT long long int
  8. const int INF = 0x3f3f3f3f ;
  9. const int MX = 1000 + 10 ;
  10. int C ,n ;
  11. int dp[2][MX][55] ;
  12. struct node
  13. {
  14. int v ,w ;
  15. }T[MX] ;
  16. bool cmp(node a, node b)
  17. {
  18. if(a.v == b.v) return a.w > b.w ;
  19. else
  20. return a.v < b.v ;
  21. }
  22. void input()
  23. {
  24. scanf("%d%d" ,&C ,&n) ;
  25. for(int i = 0 ;i < n ; ++i)
  26. scanf("%d" ,&T[i].v) ;
  27. for(int i = 0 ;i < n ; ++i)
  28. scanf("%d" ,&T[i].w) ;
  29. }
  30. int main()
  31. {
  32. //freopen("input.txt" ,"r" ,stdin) ;
  33. int Tx ;
  34. scanf("%d" ,&Tx) ;
  35. while(Tx--)
  36. {
  37. input() ;
  38. int ans = 0 ,num = 0 ,Wx = INF ;
  39. sort(T ,T+n ,cmp) ;
  40. memset(dp[0] ,-1 ,sizeof(dp[0])) ;
  41. memset(dp[1] ,0 ,sizeof(dp[1])) ;
  42. dp[0][0][0] = 0 ;
  43. for(int t = 1 ;t <= n ; ++t)
  44. for(int j = C ;j >= T[t-1].v ; --j)
  45. for(int i = t ;i >= 1 ; --i)
  46. if(dp[0][j-T[t-1].v][i-1] != -1)
  47. {
  48. int v = T[t-1].v ;
  49. int w = T[t-1].w ;
  50. if(dp[0][j][i] < dp[0][j-v][i-1] + w)
  51. {
  52. dp[0][j][i] = dp[0][j-v][i-1] + w ;
  53. dp[1][j][i] = dp[1][j-v][i-1] + j ;
  54. }
  55. else if(dp[0][j][i] == dp[0][j-v][i-1] + w && dp[1][j][i] > dp[1][j-v][i-1] + j)
  56. {
  57. dp[0][j][i] = dp[0][j-v][i-1] + w ;
  58. dp[1][j][i] = dp[1][j-v][i-1] + j ;
  59. }
  60. if(dp[0][j][i] > ans || (dp[0][j][i] == ans && i > num) || (dp[0][j][i] == ans && i == num && Wx > dp[1][j][i]))
  61. {
  62. ans = dp[0][j][i] ;
  63. num = i ;
  64. Wx = dp[1][j][i] ;
  65. }
  66. }
  67. if(Wx != INF)
  68. cout<<ans<<" "<<num<<" "<<Wx<<endl ;
  69. else cout<<"0 0 0"<<endl ;
  70. }
  71. return 0 ;
  72. }



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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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