POJ 3093 Margritas
总结
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\n", cpcases-cases, res);
}
return 0;
}

浙公网安备 33010602011771号