fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. int n,w;
  6. int a[2000][2000];
  7.  
  8. void knapsack(int wt[], int val[])
  9. {
  10. int i,j;
  11. for(i=0;i<=n;i++)
  12. {
  13. for(j=0;j<=w;j++)
  14. {
  15. if((i==0)||(j==0))
  16. {
  17. a[i][j]=0;
  18. }
  19. else if(wt[i-1]<=j)
  20. {
  21. if((val[i-1]+a[i-1][j-wt[i-1]])>a[i-1][j])
  22. {
  23. a[i][j]=val[i-1]+a[i-1][j-wt[i-1]];
  24. }
  25. else
  26. {
  27. a[i][j]=a[i-1][j];
  28. }
  29. }
  30. else
  31. {
  32. a[i][j]=a[i-1][j];
  33. }
  34. }
  35. }
  36. }
  37.  
  38. int value(int wt[],int val[])
  39. {
  40. int i=n,j=w,ans=0;
  41. while(i!=0)
  42. {
  43. if(a[i][j]>a[i-1][j])
  44. {
  45. ans+=wt[i-1];
  46. j=j-wt[i-1];
  47. i--;
  48. }
  49. else
  50. {
  51. i--;
  52. }
  53. }
  54. return ans;
  55. }
  56.  
  57.  
  58. int main() {
  59. int i,ans1,ans2;
  60. while(scanf("%d %d",&w,&n))
  61. {
  62. i=0;
  63. ans1=0;
  64. ans2=0;
  65. if((n==0)&&(w==0))
  66. {
  67. break;
  68. }
  69. int wt[n],val[n];
  70. for(i=0;i<n;i++)
  71. {
  72. scanf("%d %d",&wt[i],&val[i]);
  73. }
  74. knapsack(wt,val);
  75. ans1=a[n][w];
  76. ans2=value(wt,val);
  77. printf("%d %d\n",ans2,ans1);
  78. }
  79. return 0;
  80. }
Success #stdin #stdout 0s 18360KB
stdin
50 10
12 3
15 8
16 9
16 6
10 2
21 9
18 4
12 4
17 8
18 9 

50 10
13 8
19 10
16 8
12 9
10 2
12 8
13 5
15 5
11 7
16 2

0 0
stdout
49 26
48 32