[1411] TT要吃肉

传送门:http://acm.nbut.cn/Problem/view.xhtml?id=1411
题意:一道基础的混合背包,(本题是01背包与完全背包的混合状态,肉是完全背包,菜是01背包)。
对于背包问题,背包九讲里都有,这里推荐dd大牛的(。。),传送门:http://www.cnblogs.com/jbelial/articles/2116074.html。
所有不详讲背包问题是怎么实现的,但是dd大牛里面有一句话说的很好,复杂的问题都是由简单的问题垒起来的,如此此题当然也是由简单的裸01背包+裸完全背包实现,希望仔细去看下上面的背包九讲(只有伪代码),那么直接给出完整代码:
#include<stdio.h>
#include<string.h>
int dp[2005], val[2005], we[2005];
int max(int a,int b)
{
	if(a>b)
	return a;
	else 
	return b;
}
int main()
{
	int v, n, m, i, j;
	while(~scanf("%d%d%d",&v, &n, &m))
	{
		memset(dp, 0, sizeof(dp));
		for(i = 1;i <= n + m;i++)//n+m个数字代表蔬菜和肉的能量值,前n个为蔬菜
		{
			scanf("%d", &val[i]);
		}
		for(i = 1;i <= n + m;i++)
		{
			scanf("%d", &we[i]);//每种食物的体积
		}
		for(i = 1; i <= n + m;i++)
		{
			if(i <= n)
			{
				for(j = v;j >= 0;j--)
				{
					if(j >= we[i])
					{
						dp[j] = max(dp[j], dp[j - we[i]] + val[i]);
					}
				}
			}
			else
			{
				for(j = 0;j <= v;j++)
				{
					if(j >= we[i])
					{
						dp[j] = max(dp[j], dp[j - we[i]] + val[i]);
					}
				}
			}
		}
		int x = dp[0];
		for(j = v; j >= 0; j--)
		{
			if(dp[j] > x)
			x = dp[j];
		}
		printf("%d\n",x);
	}
	return 0;
}


你可能感兴趣的:([1411] TT要吃肉)