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;
}

  

posted @ 2014-04-06 19:25  周卓  阅读(181)  评论(0编辑  收藏  举报