Go: package main

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

const MaxW = 1000
const MaxN = 1000

type Tuple struct {
	Value  int
	Weight int
}

func nextLine(sc *bufio.Scanner) string {
	sc.Scan()
	return sc.Text()
}

func solve(w int, n int, vws []Tuple) Tuple {
	var dp [MaxN + 1][MaxW + 1]int

	for i := 0; i < n; i++ {
		for j:= w; j > 0; j-- {
			if j < vws[i].Weight {
				dp[i + 1][j] = dp[i][j]
			} else {
				dp[i + 1][j] = int(math.Max(float64(dp[i][j]), float64(dp[i][j - vws[i].Weight] + vws[i].Value)))
			}
		}
	}

	maxValue := dp[n][w]
	minWeight := w

	for j := w - 1; j > 0; j-- {
		if maxValue == dp[n][j] {
			minWeight = j
		} else {
			break
		}
	}

	return Tuple{Value: maxValue, Weight: minWeight}
}

func main() {
	var sc = bufio.NewScanner(os.Stdin)
	index := 1
	for {
		var w, n int
		w, _ = strconv.Atoi(nextLine(sc))
		if w == 0 {
			return
		}
		n, _ = strconv.Atoi(nextLine(sc))

		vws := make([]Tuple, n, n)
		for i := 0; i < n; i++ {
			array := strings.Split(nextLine(sc), ",")
			v, _ := strconv.Atoi(array[0])
			w, _ := strconv.Atoi(array[1])
			vws[i] = Tuple{Value: v, Weight: w}
		}

		t := solve(w, n, vws)
		fmt.Printf("Case %d:\n", index)
		fmt.Println(t.Value)
		fmt.Println(t.Weight)
		index++
	}
}

C++: #include<iostream>
#include<memory.h>
#include<algorithm>
using namespace std;
int main()
{
	int W,n,c=0;
	int w,v;
	int dp[1001][1001];
	while (1){
		cin >> W;
		if (W == 0)break;
		c++;
		cin >> n;

		for (int i = 1; i <= n; i++){
			cin >> w >> v;
			for (int i2 = 0; i2 <= W; i2++){
				if (i2 < w)
					dp[i][i2] = dp[i - 1][i2];
				else
					dp[i][i2] = max(dp[i - 1][i2], dp[i - 1][w - i2] + v);
			}
		}
		int maxv=0, maxw;
		for (int i = 0; i <= W; i++){
			if (maxv < dp[n][i]){
				maxv = dp[n][i];
				maxw = i;
			}
		}
		cout << "Case" << c << ":" << endl;
		cout << maxv << endl << maxw << endl;
	}
	
}

C++: 
//include
//------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>

using namespace std;

//conversion
//------------------------------------------
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

//math
//-------------------------------------------
template<class T> inline T sqr(T x) {return x*x;}

//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef long long LL;

//container util
//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())

//repetition
//------------------------------------------
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

//constant
//--------------------------------------------
const double EPS = 1e-10;
const double PI  = acos(-1.0);
const int DX[] = {0, 1, 0, -1};
const int DY[] = {-1, 0, 1, 0};


//clear memory
#define CLR(a) memset((a), 0 ,sizeof(a))

//debug
#define dump(x)  cerr << #x << " = " << (x) << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;

int main(int argc, char const *argv[])
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	int w, n;
	int index = 1;
	while(true){
		cin >> w;
		if(w == 0) break;
		cin >> n;
		VVI dp(n + 1, VI(w + 1));
		char comma;
		VI values(n);
		VI weights(n);
		REP(i, n){
			cin >> values[i] >> comma >> weights[i];
		}
		REP(i, n){
			REP(j, w + 1){
				if(j + weights[i] <= w){
					int &value = dp[i + 1][j + weights[i]];
					 value = max(value, values[i] + dp[i][j]);
				}
				dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);
			}
		}
		int weight = max_element(ALL(dp[n])) - dp[n].begin();
		int value_sum = dp[n][weight]; 
		cout << "Case " << index << ":" << endl;
		cout << value_sum << endl;
		cout << weight << endl;

		index++;
	}



	return 0;
}

C++: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <ctime>
using namespace std;

#define rep(i,a,n) for(int i=a; i<n; i++)
#define repr(i,a,n) for(int i=a; i>=n; i--)
#define pb(a) push_back(a)
#define fr first
#define sc second
#define INF 999999999

#define X real()
#define Y imag()
#define EPS (1e-10)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) ( EQ((a).X, (b).X) && EQ((a).Y, (b).Y) )
#define LE(n, m) ((n) < (m) + EPS)
#define GE(n, m) ((n) + EPS > (m))

typedef vector<int> VI;
typedef vector<VI> MAT;
typedef pair<int, int> pii;
typedef long long int ll;

typedef complex<double> P;
typedef pair<P, P> L;
typedef pair<P, double> C;

namespace std {
    bool operator<(const P a, const P b) {
        return a.X != b.X ? a.X < b.X : a.Y < b.Y;
    }
}

int const MOD = 1000000007;

int main() {
    int W,N;
    int c = 0;
    while(cin >> W) {
        if(W == 0) break;
        c++;
        cin >> N;
        int v[1010], w[1010];

        rep(i,0,N) scanf("%d,%d",&v[i], &w[i]);
        int dp[1010][1010];
        rep(j,0,W+1) dp[0][j] = 0;
        rep(i,0,N) {
            rep(j,0,W+1) {
                if(j < w[i]) dp[i+1][j] = dp[i][j];
                else dp[i+1][j] = max(dp[i][j], dp[i][j-w[i]] + v[i]);
            }
        }

        int a = 0, b = 0;
        rep(i,0,W+1) {
            if(dp[N][i] > a) {
                a = dp[N][i];
                b = i;
            }
        }

        printf("Case %d:", c);
        cout << a << endl;
        cout << b << endl;
    }

    return 0;
}

C++: #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cassert>
#include <iostream>
#include <cctype>
#include <sstream>
#include <string>
#include <list>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <utility>
#include <numeric>
#include <algorithm>
#include <bitset>
#include <complex>
#include <fstream>
using namespace std;
typedef long long ll;
const double EPS = 1e-9;
typedef vector<int> vint;
typedef pair<int, int> pint;
#define rep(i, n) REP(i, 0, n)
#define ALL(v) v.begin(), v.end()
#define MSG(a) cout << #a << " " << a << endl;
#define REP(i, x, n) for(int i = x; i < n; i++)
template<class T> T RoundOff(T a){ return int(a+.5-(a<0)); }
template<class T, class C> void chmax(T& a, C b){ if(a < b) a = b; }
template<class T, class C> void chmin(T& a, C b){ if(b < a) a = b; }
template<class T, class C> pair<T, C> mp(T a, C b){ return make_pair(a, b); }

const int INF = 1 << 30;

int main()
{
    int w, n;
	int times = 0;
    while(cin >> w && w)
    {
		times++;
		cin >> n;

		vint now(w+1, 0), last(w+1, 0);

		rep(i, n)
		{
			int val, wei;
			char k;
			cin >> val >> k >> wei;

			rep(j, w+1)
				now[j] = (j < wei ? last[j] : max(last[j], last[j - wei] + val));

			last = now;
		}

		int rv = 0, rw = 0;
		rep(i, w + 1)
		{
			if(rv < last[i])
			{
				rv = last[i];
				rw = i;
			}
		}

		cout << "Case " << times << ":" << endl << rv << endl << rw << endl;
	}
}