总结
1. 枚举 i 是未被取到的价值最小的酒, 那么 0~i-1 都取到了, 对 i+1~end 运行 01 背包
代码 有些极端 case 没考虑到
/* * source.cpp * * Created on: Apr 6, 2014 * Author: sangs */ #include <stdio.h> #include <iostream> #include <string> #include <vector> #include <memory.h> #include <algorithm> using namespace std; int arr[100]; int dp[2000]; int cal(int n, int target) { int res = 0; int sum = 0; for(int i = 0; i < n; i ++) { sum += arr[i]; } if(sum <= target) // all wine can be put into pack return (res = 1); for(int i = 0; i < n; i ++) { memset(dp, 0, sizeof(dp)); dp[0] = 1; sum = 0; for(int j = 0; j < i; j ++) sum += arr[j]; for(int j = i+1; j < n; j ++) { for(int k = target-sum; k >= arr[j]; k --) { dp[k] += dp[k-arr[j]]; } } // statistic for(int k = target-sum; k >= 0; k --) { if(target-sum - k >= arr[i]) break; res += dp[k]; } } return res; } int main() { freopen("input.txt", "r", stdin); int cases, cpcases; scanf("%d", &cases); cpcases = cases; while(cases --) { int n, target; scanf("%d%d", &n, &target); for(int i = 0; i < n; i ++) scanf("%d", arr+i); int res = cal(n, target); printf("%d %d ", cpcases-cases, res); } return 0; }