Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
	"fmt"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	Case := 1
	for {
		scanner.Scan()
		W, _ := strconv.Atoi(scanner.Text())
		if W == 0 {
			break
		}
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		w := make([]int, n+1)
		v := make([]int, n+1)
		for i := 1; i <= n; i++ {
			scanner.Scan()
			info := strings.Split(scanner.Text(), ",")
			v[i], _ = strconv.Atoi(info[0])
			w[i], _ = strconv.Atoi(info[1])
		}
		// fmt.Println(v)
		// fmt.Println(w)
		dp := make([][]int, n+1)
		for i := range dp {
			dp[i] = make([]int, W+1)
		}
		maxV := -(1 << 21)
		minW := 1 << 21
		for i := 1; i <= n; i++ {
			for j := 1; j <= W; j++ {
				// fmt.Println(dp)
				if j-w[i] >= 0 {
					dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
					if maxV < dp[i][j] {
						maxV = dp[i][j]
						minW = j
					} else if maxV == dp[i][j] {
						minW = min(minW, j)
					}
				} else {
					dp[i][j] = dp[i-1][j]
				}
			}
		}
		fmt.Printf("Case %d:\n", Case)
		Case += 1
		fmt.Println(maxV)
		fmt.Println(minW)
	}
}
func max(x, y int) int {
	if x < y {
		return y
	}
	return x
}
func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

C++: #include<iostream>

using namespace std;

class item
{
public:
	int value;
	int weight;
	bool flag;
	item()
	{
		flag=false;
	}
};

bool input(int *c, int *n, item it[1000])
{
	cin>>*c;
	if(*c==0)
	{
		return false;
	}
	cin>>*n;
	for(int i=0;i<*n;i++)
	{
		char t;
		cin>>it[i].value>>t>>it[i].weight;
	}
	return true;
}

item max(item a, item b)
{
	if(a.value>b.value)
	{
		return a;
	}
	else
	{
		return b;
	}
}

item add(item a, item b)
{
	a.value+=b.value;
	a.weight+=b.weight;
	return a;
}

item table[1000][1000];

item solve(int c, int n, item it[1000])
{
	if(table[c][n].flag!=true){
		if(c==0||n==0)
		{
			table[c][n].value=0;
			table[c][n].weight=0;
		}
		else if(c<it[n-1].weight)
		{
			table[c][n]=solve(c,n-1,it);
		}
		else
		{
			table[c][n]=max(solve(c,n-1,it),add(solve(c-it[n-1].weight,n-1,it),it[n-1]));
		}
		table[c][n].flag=true;
	}
	return table[c][n];
}

int main(void)
{
	int c,n;
	item it[1000];
	for(int i=1;input(&c,&n,it);i++)
	{
		item ans=solve(c,n,it);
		cout<<"Case "<<i<<':'<<endl<<ans.value<<endl<<ans.weight<<endl;
	}
}

C++: #include <algorithm>
#include <cstdio>
using namespace std;

int T, N, V[1010], W[1010];

int main() {

	for ( int t = 1; scanf( "%d", &T ) && T; t++ ) {
	
		scanf( "%d", &N );
	
		for ( int i = 0; i < N; i++ ) { scanf( "%d,%d", &V[i], &W[i] ); }
	
		int A[1010][1010] = {{0}};
	
		for ( int i = 1; i <= N; i++ ) {
		
			for ( int j = 0; j <= T; j++ ) {
	
				if ( j < W[i-1] ) {
	
					A[i][j] = A[i-1][j];
	
				} else {
	
					A[i][j] = max( A[i-1][j], A[i-1][j-W[i-1]] + V[i-1] );
					
				}
	
			}
	
		}
		
		/*for ( int i = 1; i <= N; i++ ) {
		
			printf( "i = %d\n", i );
		
			for ( int j = 0; j <= T; j++ ) {
			
				printf( "\tj = %d\t%d\n", j, A[i][j] );
			
			}
		
		}*/
		
		int best = -1, best_w = -1;
		
		for ( int j = 0; j <= T; j++ ) {
		
			if ( A[N][j] > best ) {
			
				best = A[N][j];
				best_w = j;
				
			}
		
		}
		
		printf( "Case %d:\n%d\n%d\n", t, best, best_w );
	
	}

}

C++: #include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX_N = 1020;
const int MAX_W = 1020;

typedef struct {
  int v;
  int w;
} DP;

// ??\???
int W, N;
int v[MAX_N], w[MAX_N];

// ?????¢???????????????
DP dp[MAX_N][MAX_W]; 

// i????????\?????§j????????????????????§??°??????????????????????????????????¨?????????§?????¨???????????????????????????
DP rec(int i, int j) {
  if (dp[i][j].v != -1)
    return dp[i][j];

  int res;
  int weight;
  if (i == N) {
    res = 0;
    weight = 0;
  } else if (w[i] > j) {
    DP result = rec(i+1, j);
    res = result.v;
    weight = result.w;
  } else {
    DP result1 = rec(i+1, j);
    DP result2 = rec(i+1, j-w[i]);
    result2.v += v[i];
    result2.w += w[i];

    if (result1.v > result2.v) {
      res = result1.v;
      weight = result1.w;
    } else if (result1.v < result2.v) {
      res = result2.v;
      weight = result2.w;
    } else {
      res = result1.v;
      weight = min(result1.w, result2.w);
    }
   
  }

  dp[i][j].v = res;
  dp[i][j].w = weight;
  return dp[i][j];
}

DP solve() {
  for (int i=0; i<MAX_N; i++) {
    for (int j=0; j<MAX_W; j++) {
      dp[i][j].v = -1;
    }
  }

  return rec(0, W);
}

int main() {
  int counter = 0;
  
  while(scanf("%d", &W), W) {
    counter++;
    
    scanf("%d", &N);
    for (int i=0; i<N; i++) {
      scanf("%d, %d", &v[i], &w[i]);
    }

    DP result = solve();
    printf("Case %d:\n", counter);
    printf("%d\n%d\n", result.v, result.w);
  }
}

C++: #include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<complex>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<numeric>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cctype>

#define mp make_pair
#define pb push_back
#define REP(i,a,n) for(int i = a;i < (n);i++)
#define rep(i,n) for(int i = 0;i < (n);i++)
#define all(s) s.begin(), s.end()
#define rall(s) s.rbegin(), s.rend()

using namespace std;

typedef long long LL;
typedef vector<int> VI;
typedef vector<vector<int> > VII;
typedef pair<int,int> PII;

const int DX[]={1,0,-1,0},DY[]={0,-1,0,1};

int main(){
	cin.tie(0);
   	ios::sync_with_stdio(false);
	int w,n,index = 1;
	int ans_v = 0,ans_w = 0;
	VI value,weight;

	while(1){
		cin >> w;
		if(w == 0) break;
		cin >> n;

		VII dp(n + 1,VI (w + 1,-1));
		dp[0][0] = 0;

		rep(i,n){
			int a,b;
			char ch;
			cin >> a >> ch >> b;
			value.pb(a);
			weight.pb(b);
		}

		rep(i,n){
			rep(j,w + 1){
				if(dp[i][j] == -1) continue;
				dp[i + 1][j] = max(dp[i + 1][j],dp[i][j]); //valle[i]テ」ツつ津ィツカツウテ」ツ?陛」ツ?ェテ」ツ??・ツ?エテ・ツ青?
				if(j + weight[i] <= w){ //value[i]テ」ツつ津ィツカツウテ」ツ?凖・ツ?エテ・ツ青?
					dp[i + 1][j + weight[i]] = max(dp[i + 1][j + weight[i]],value[i] + dp[i][j]);
					
				}
			}
		}

		rep(i,dp[n].size()){
			if(dp[n][i] > ans_v){
				ans_v = dp[n][i];
				ans_w = i;
			}
		}		

		cout << "Case " << index++ << ':' << endl;
		cout << ans_v << endl << ans_w << endl;
	}

	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

bool cmp(pair<int,int> &a,pair<int,int> &b){
	if( a.first != b.first ) return a.first < b.first;
	else return a.second > b.second;
}
int main(){
	int n,W;
	int t = 1;
	while( cin >> W >> n && W ){
		vector< pair<int,int> > cur;
		cur.push_back({0,0});
		for(int i = 0 ; i < n ; i++){
			int w,c;
			scanf("%d,%d",&c,&w);
			for(int j = 0 , t = cur.size() ; j < t ; j++ )
				cur.push_back({cur[j].first+w,cur[j].second+c});
			sort(cur.begin(),cur.end(),cmp);
			int maxi = -1;
			vector< pair<int,int> > nex;
			for(int j = 0 ; j < cur.size() ; j++){
				if( maxi >= cur[j].second ) continue;
				nex.push_back(cur[j]);
				maxi = cur[j].second;
			}cur = nex;
		}
		int ans = 0, ans2 ;
		for(int i = 0 ; i < cur.size() ; i++){
			if( cur[i].first <= W ){
				ans = cur[i].second;
				ans2 = cur[i].first;
			}
		}

		cout << "Case " << t++ << ":" << endl;
		cout << ans << endl;
		cout << ans2 << endl;
	}
}