首页 > ACM题库 > HDU-杭电 > hdu 2639 Bone Collector II-背包问题-[解题报告]C++
2014
02-12

hdu 2639 Bone Collector II-背包问题-[解题报告]C++

Bone Collector II

问题描述 :

The title of this problem is familiar,isn’t it?yeah,if you had took part in the "Rookie Cup" competition,you must have seem this title.If you haven’t seen it before,it doesn’t matter,I will give you a link:

Here is the link:http://acm.hdu.edu.cn/showproblem.php?pid=2602

Today we are not desiring the maximum value of bones,but the K-th maximum value of the bones.NOTICE that,we considerate two ways that get the same value of bones are the same.That means,it will be a strictly decreasing sequence from the 1st maximum , 2nd maximum .. to the K-th maximum.

If the total number of different values is less than K,just ouput 0.

输入:

The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, K(N <= 100 , V <= 1000 , K <= 30)representing the number of bones and the volume of his bag and the K we need. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.

输出:

The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, K(N <= 100 , V <= 1000 , K <= 30)representing the number of bones and the volume of his bag and the K we need. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.

样例输入:

3
5 10 2
1 2 3 4 5
5 4 3 2 1
5 10 12
1 2 3 4 5
5 4 3 2 1
5 10 16
1 2 3 4 5
5 4 3 2 1

样例输出:

12
2
0

链接:点我

现在01的基础上多加一维,dp[v][k],表示在v空间下第k大的价值。。。

更新的时候有两个数组A、B,A记录选择第i个物品的从大到小排列,B记录不选择的从大到小排列,然后合并AB,选出AB里面前k个最大的。合并到dp中。。。

#include <iostream>
#include <cstdio>
using namespace std;
#define max(a,b)	((a)>(b)?(a):(b))
const int maxn = 1005;
int main()
{
	int T;
	scanf("%d", &T);
	int dp[maxn][33], val[maxn], vol[maxn], A[33], B[33];
	while (T--)
	{
		int n, v, k;
		scanf("%d %d %d", &n, &v, &k);
		int i, j, kk;
		for (i=0; i<n; i++) scanf("%d", &val[i]);
		for (i=0; i<n; i++) scanf("%d", &vol[i]);
		memset(dp, 0, sizeof(dp));

		int a, b, c;
		for (i=0; i<n; i++)
			for (j=v; j>=vol[i]; j--)
			{
				for (kk=1; kk<=k; kk++)
				{
					A[kk] = dp[j-vol[i]][kk] + val[i];
					B[kk] = dp[j][kk];
				}
				A[kk] = -1, B[kk] = -1;
				a = b = c = 1;
				while (c<=k && (A[a] != -1 || B[b] != -1))
				{
					if (A[a] > B[b])
						dp[j][c] = A[a++];
					else
						dp[j][c] = B[b++];
					if (dp[j][c] != dp[j][c-1])
						c++;
				}
			}

		printf("%d\n", dp[v][k]);
	}
	return 0;
}

解题转自:http://blog.csdn.net/liuqiyao_01/article/details/8751523


  1. 第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。

  2. 问题3是不是应该为1/4 .因为截取的三段,无论是否能组成三角形, x, y-x ,1-y,都应大于0,所以 x<y,基础应该是一个大三角形。小三角是大三角的 1/4.

  3. 第一题是不是可以这样想,生了n孩子的家庭等价于n个家庭各生了一个1个孩子,这样最后男女的比例还是1:1