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 <bits/stdc++.h>
using namespace std;
/*{{{*/  //template
#define REP(i,n) for(int i=0;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<29
#define LINF LLONG_MAX/3
#define MP make_pair
#define PB push_back
#define EB emplace_back
#define ALL(v) (v).begin(),(v).end()
#define all(v) ALL(v)
#define debug(x) cerr<<#x<<":"<<x<<endl
#define debug2(x,y) cerr<<#x<<","<<#y":"<<x<<","<<y<<endl
#define CININIT cin.tie(0),ios::sync_with_stdio(false)
//struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double{ double d; explicit Double(double x) : d(x){} };
ostream& operator<<(ostream& os,const Double x){ os << fixed << setprecision(20) << x.d; return os; }
template<typename T> ostream& operator<<(ostream& os,const vector<T>& vec){ os << "["; for(const auto& v : vec){ os << v << ","; } os << "]"; return os; }
template<typename T,typename U> ostream& operator<<(ostream& os,const pair<T,U>& p){ os << "(" << p.first << ","<< p.second <<")"; return os; }
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a,ll b){ if(b==0) return a; else return gcd(b,a%b); }
 
constexpr ll mod = 1e9+7;
const int dx[]={1,0,-1,0} ,dy[] = {0,1,0,-1};
/*}}}*/


void solve(int W,int N){
    vector<int> v(N),w(N);
    char c;
    rep(i,N) cin>>v[i]>>c>>w[i];

    vector<vector<int>> dp(N+10,vector<int>(W+10,0));
    for(int i=0;i<N;i++){
        // use v[i],w[i]
        for(int j=0;j<=W;j++){
            if(j+w[i]<=W){
                dp[i+1][j+w[i]] = max(dp[i+1][j+w[i]],dp[i][j]+v[i]);
                dp[i+1][j] = max(dp[i+1][j],dp[i][j]);
            }else{
                dp[i+1][j] = max(dp[i+1][j],dp[i][j]);
            }
        }
    }

    for(int i=0;i<=W;i++) if(dp[N][i]==dp[N][W]){
        printf("%d\n%d\n",dp[N][W],i);
        return;
    }
    assert(false);
}

int main(){
    int w,n;
    int cnt=0;
    while(1){
        cin>>w;
        if(w==0) break;
        cin>>n;
        printf("case %d:\n",++cnt);
        solve(w,n);
    }
}

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

int main(){

	int cnt, N, W, value, weight, v[1001][1001], w[1001][1001];

	cnt = 0;

	while(1){
		cin >> W;
		if(W == 0) break;
		
		cnt++;
		cin >> N;

		for(int i=0; i<N; i++){
			for(int j=0; j<W; j++){
				v[i][j] = 0;
				w[i][j] = 0;
			}
		}
		
		for(int i=1; i<=N; i++){
			scanf("%d, %d", &value, &weight);
			for(int j=0; j<=W; j++){
				for(int k=0; k<=j; k++){
					if(w[i-1][k] + weight <= j && v[i-1][k] + value > v[i][j]){
						v[i][j] = v[i-1][k] + value;
						w[i][j] = w[i-1][k] + weight;
					}
					if(v[i-1][k] > v[i][j]){
						v[i][j] = v[i-1][k];
						w[i][j] = w[i-1][k];
					}
				}
			}
		}

		cout << "Case " << cnt << ":" << endl;
		cout << v[N][W] << endl;
		cout << w[N][W] << endl; 
		
	}

	return 0;

}

C++: #include<stdio.h>
int main(void){
    int W,N,v[1000], w[1000], vw[1000], i, j, key, check, sum_v, sum_w;
    scanf("%d %d", &W, &N);
    while ( W ) {
        for ( i = 0; i < N; i++ ) {
            scanf("%d,%d", &v[i], &w[i]);
            vw[i] = v[i] / w[i];
            /*printf("a %d %d\n", N, i);*/
        }
        /*printf("b\n");*/
        check = 1;
        for ( i = 0; check; i++ ) {
            check = 0;
            for ( j = N - 1; j > i; j-- ) {
                if (vw[j] > vw[j - 1] ) {
                    key = vw[j];
                    vw[j] = vw[j - 1];
                    vw[j - 1] = key;
                    key = v[j];
                    v[j] = v[j - 1];
                    v[j - 1] = key;
                    key = w[j];
                    w[j] = w[j - 1];
                    w[j - 1] = key;
                } else if (vw[j] == vw[j - 1] && w[j] < w[j - 1] ) {
                    key = vw[j];
                    vw[j] = vw[j - 1];
                    vw[j - 1] = key;
                    key = v[j];
                    v[j] = v[j - 1];
                    v[j - 1] = key;
                    key = w[j];
                    w[j] = w[j - 1];
                    w[j - 1] = key;
                }
            }
        }
        for ( i = 0; i < N; i++ ) printf("vw%d v%d w%d\n", vw[i], v[i], w[i]);
        sum_v = sum_w = 0;
        for ( i = 0; i < N; i++ ) {
            if ( sum_w + w[i] <= W ) {
                sum_v += v[i];
                sum_w += w[i];
            }
            printf("sum_v%d sum_w%d\n", sum_v, sum_w);
        }
        printf("\n");
        printf("%d\n%d", sum_v, sum_w);
    }
    return 0;
}

C++: #include <iostream>
#include <complex>

typedef std::complex<int> P;
using namespace std;

#define SAFE_DELETE(p) {\
if(p != NULL){\
	delete [] p;\
}\
}

int w,n;
int* item;
int* price;

P dfs(int index, P now)
{
	if(now.real() > w)
	{
		return P(0, -100);
	}
	if(index >= n)
		return now;
	P next = P(now.real()+item[index], now.imag()+ price[index]);
	P a = dfs(index+1, next);
	P b = dfs(index+1, now);
	if(a.imag() > b.imag())
	{
		return a;
	}
	else if(a.imag() < b.imag())
	{
		return b;
	}
	else if(a.real() > b.real())
	{
		return b;
	}
}

int main(int argc, char *argv[]) {
	item = NULL;
	price = NULL;
	int i=1;
	for(;;)
	{
		cin >> w >> n;		
		if(n <= 0)
			return 0;
		SAFE_DELETE(item);
		SAFE_DELETE(price);
		item = new int[n];
		price = new int[n];
		
		char delim = ',';
		for(int i=0; i<n; i++)
		{
			cin >> price[i] >> delim >> item[i];
		}
		P ans = dfs(0, P(0,0));
		cout << "Case "<< i << ":" << endl;
		cout << ans.imag() << endl;
		cout << ans.real() << endl;

		i++;
	}

}