01背包(滚动数组).c语言实现

一维dp数组(滚动数组)

上层可以重复利用,直接拷贝到当前层

递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

 初始化:dp[0]=0

 

#include
int main()
{
	int i=0,j,dp[100]={0},weight[100],value[100],k,bagsize;
	scanf("%d",&bagsize);
	while(scanf("%d %d",&weight[i],&value[i])!=EOF)
	{
		i++;
	}
	for(k=0;k=weight[k];j--)//遍历背包容量,j-weight[i]>=0
		{
			if(dp[j]>dp[j-weight[k]]+value[k])
				dp[j]=dp[j];
			else
				dp[j]=dp[j-weight[k]]+value[k];
		}
		printf("%d\n",dp[bagsize]);
		for(k=0;k<=bagsize;k++)
			printf("%d ",dp[k]);
		return 0;
}

			


一维dp数组结果 

01背包(滚动数组).c语言实现_第1张图片 

二维dp数组结果

01背包(滚动数组).c语言实现_第2张图片 

 

 

你可能感兴趣的:(动态规划,日常练题,算法,动态规划,算法,蓝桥杯)