fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,max_wt;
  4. int val[100],wt[100];
  5. int dp[100][1000];
  6. int knapsack(int i,int ava_wt)
  7. {
  8. if(ava_wt==0)
  9. return 0;
  10. if(i==n)
  11. return 0;
  12. if(dp[i][ava_wt]!=-1)
  13. return dp[i][ava_wt];
  14. if(ava_wt>=wt[i])
  15. {
  16. int niye=val[i]+knapsack(i+1,ava_wt-wt[i]);
  17. int naniye=knapsack(i+1,ava_wt);
  18. return dp[i][ava_wt]=max(niye,naniye);
  19. }
  20. else
  21. {
  22. return knapsack(i+1,ava_wt);
  23. }
  24. }
  25. void founditem(int i,int ava_wt)
  26. {
  27. while(i<n&& ava_wt>0)
  28. {
  29. if(ava_wt>=wt[i])
  30. {
  31. int niye=val[i]+knapsack(i+1,ava_wt-wt[i]);
  32. int naniye=knapsack(i+1,ava_wt);
  33. if(niye>=naniye)
  34. {
  35. cout<<i+1<<wt[i]<<val[i]<<"\n";
  36. ava_wt=ava_wt+wt[i];
  37. i++;
  38. }
  39. else
  40. {
  41. i++;
  42. }
  43. }
  44. else
  45. {
  46. i++;
  47. }
  48. }
  49. }
  50. int main()
  51. {
  52.  
  53. cin>>n;
  54. for(int i=0;i<n;i++)
  55. {
  56. cin>>wt[i];
  57. }
  58. for(int i=0;i<n;i++)
  59. {
  60. cin>>val[i];
  61. }
  62. cin>>max_wt;
  63. for(int i=0;i<=n;i++)
  64. {
  65. for(int j=0;j<=max_wt;j++)
  66. {
  67. dp[i][j]=-1;
  68. }
  69. }
  70.  
  71. int max=knapsack(0,max_wt);
  72. cout<<max<<endl;
  73. founditem(0,max_wt);
  74. }
Success #stdin #stdout 0.01s 5324KB
stdin
7
5 7 3 8 4 6 9 
12 15 8 9 11 13 20
15
stdout
36
1512
2715
338
489
5411
6613
7920