01 背包基础题目



这道题目很简单,但是数据有一个很坑人之处,就是,有的骨头有价值,但是他所占的空间为0,如果你不知道你的代码为什么总是WA的话,可以试试下面这组数据

 
 

1

2 0

20 1

0 1

答案应该是20.当然,这是按照普通的二维DP来做的,没有进行优化,其实感觉DP就是背包啊

用了两种方法,优化的和没优化的,就是想多练练

//Bone Collector//
//题目链接:http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1001&ojid=0&cid=2521&hide=0

//一维数组//

#include<stdio.h>
#include<string.h>
#define max(x,y) (x)>(y)?(x):(y)
int f[2000],c[2000],w[2000];
int main()
{
	int i,j,k;
	int t;
	int n,v;
	scanf("%d",&t);
	while(t--)
	{
		memset(f,0,sizeof(f));
		scanf("%d%d",&n,&v);
		for(i=1;i<=n;i++)
			scanf("%d",&w[i]); 
		for(i=1;i<=n;i++)
			scanf("%d",&c[i]);
		for(j=1;j<=n;j++)
		{
			for(k=v;k>=c[j];k--)
				f[k]=max(f[k],f[k-c[j]]+w[j]);
		}
		printf("%d\n",f[v]);
	}
	return 0;
}


//二位普通DP思想//
#include<stdio.h>
#include<string.h>
#define max(x,y) (x)>(y)?(x):(y)
int w[2000],c[2000];
int dp[2000][2000];
int main()
{
	int t;
	int n, v;
	int i, j, k;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d%d", &n, &v);
		memset(dp,0,sizeof(dp));
		for(i = 1; i <= n; i++)
			scanf("%d", &w[i]);
		for(i = 1; i <= n; i++)
			scanf("%d", &c[i]);

		for(i = 1; i <= n; i++)
		{
			for(j = 0; j <= v; j++)
				if(j>=c[i])
					dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);
				else
				dp[i][j]=dp[i-1][j];
		}
		printf("%d\n", dp[n][v]);
	}
	return 0;
}




你可能感兴趣的:(01 背包基础题目)