01背包中二维数组和一维数组的写法

开门见山

01背包问题有两种写法,一种是开二维数组记录状态,一种是只开一维数组记录状态。
二维数组:

		for(i = 1;i<n;i++)
		{
			for(j = m;j>=1;j--)
			{
				if((j-value[i])>=0)
				{
					dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+value[i]);
				}
				else dp[i][j] = dp[i-1][j];
				
			}
		}

第二个for循环也可以依次加来遍历

		for(i = 1;i<n;i++)
		{
			for(j = 1;j<=m;j++)
			{
				if((j-value[i])>=0)
				{
					dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+value[i]);
				}
				else dp[i][j] = dp[i-1][j];
				
			}
		}

一维数组

		for(i = 0;i<n-1;i++)
		{
			for(j = m;j>=w[i];j--)
			{
				dp[j] = max(dp[j],dp[j-w[i]]+value[i]);
			}
		}

一维数组的第二个for循环必须依次减

原因

后面填坑,今天有点忙

你可能感兴趣的:(动态规划,动态规划,数据结构,算法)