fork download
  1. #include <stdio.h>
  2. int fun[105],cost[105];
  3. int K[105][105];
  4. //int max(int a,int b ) { return ( a > b )? a : b; }
  5. int fee;
  6. int knapSack( int S, int N,int wei[],int val[] ) {
  7. int i, w;
  8. // fee=0;
  9. //int K[ N + 1 ][ S + 1 ];
  10.  
  11. for ( i = 0; i <= N; ++i ) {
  12.  
  13. for ( w = 0; w <= S; ++w ) {
  14. if ( i == 0 || w == 0 ) {
  15. K[ i ][ w ] = 0;
  16. }
  17. else if ( wei[ i - 1 ] <= w ) {
  18. if( val[ i - 1 ] + K[ i - 1 ][ w - wei[ i - 1 ] ] > K[ i - 1 ][ w ])
  19. {K[ i ][ w ] = val[ i - 1 ] + K[ i - 1 ][ w - wei[ i - 1 ] ];
  20. /* if(f)
  21. {fee += wei[i-1];
  22. f=0;
  23. printf("fee = %d",fee);*/
  24.  
  25. }
  26.  
  27. else
  28. K[i][w]=K[i-1][w];
  29. }
  30.  
  31. else {
  32. K[ i ][ w ] = K[ i - 1 ][ w ];
  33. }
  34. }
  35. }
  36. return K[ N ][ S ];
  37. }
  38. int main(void) {
  39. int b,n,i,ans;
  40. while(1)
  41. {
  42. scanf("%d%d",&b,&n);
  43. if(b==0 && n==0)
  44. break;
  45. for(i=0;i<n;i++)
  46. {
  47. scanf("%d%d",&cost[i],&fun[i]);
  48. }
  49.  
  50. ans=knapSack(b,n,cost,fun);
  51. fee=0;
  52. if(ans!=0)
  53. {for(i=1;i<=b;i++)
  54. {
  55. if(K[n][i]==ans)
  56. { fee=i;
  57. break;}
  58. }}
  59. printf("%d %d\n",fee,ans);
  60. }
  61. return 0;
  62. }
  63.  
Success #stdin #stdout 0s 2160KB
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