View Code of Problem 2743

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int T, n, m, sum, v[33];
int ans, f[1005];

int main (){
    scanf("%d", &T);
    for(int num = 1; num <= T; num++){
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i++) 
            scanf("%d", v + i);
        sort(v + 1, v + n + 1);
        if(v[1] > m){
            printf("%d 0\n", num); 
            continue;
        }

        sum = ans = 0;
        for(int i = 1; i < n; i++){
            if(sum > m) 
                break;
            memset(f, 0, sizeof(f));
            f[sum] = 1;
            for(int k = i + 1; k <= n; k++)
                for(int j = m; j >= v[k] + sum; j--)
                    f[j] = f[j] + f[j-v[k]];
                    
            int tmp = max(m - v[i] + 1, sum);
            for(int j = tmp; j <= m; j++) 
                ans += f[j];
            sum += v[i];
        }

        printf ("%d %d\n", num, ans);
    }
    return 0;
}

Double click to view unformatted code.


Back to problem 2743