算法-动态规划法01背包问题

动态规划

code

//arithmetic_01backpack_DP
#include <iostream>
#include <stdio.h>

#include <string.h>//包含memset 初始化函数 
#define num 4
using namespace std;

//01 背包 动态规划 0222  0235 02357
 
int value[num] = {2,4,3,7},weight[num] = {2,3,5,5};

void dynamic_programming(int Backpack_Capacity) //参数 背包体积 
{
	if(Backpack_Capacity <= 0)
	{
		printf("dp error!");
	}
	int c = Backpack_Capacity;
	
	int dp[num + 1][c + 1];
	memset(dp,0, (num + 1) * (c + 1) * sizeof(int) );
	
	for(int i = 0;i < num;i ++)
	{
		for(int j = 1;j < c + 1;j ++)
		{
			if(j < weight[i])//加入的i号物体太大 等于没有加入,故此时 等于 没有i号 物体时的 最大价值。 
			{
				dp[i + 1][j] = dp[i][j];
			}
			else
			{
				dp[i + 1][j] = max(dp[i][j],dp[i][j - weight[i]] + value[i]);//与 前一行 的 该列数据比较(出去 i号物体 最大价值) 
			}
			
		}
	}
	//输出 
	for(int i = 0;i < num + 1;i ++)
	{
		//打印dp数组 
		for(int j = 0;j < c + 1;j ++)
		{
			printf("%d\t",dp[i][j]);
		}
		printf("\n");
	}
	
	return;
}
int main()
{
	int back_v = 0;
	while(1)//循环 
	{
		printf("Please,enter the volume of the backpack: ");
		scanf("%d",&back_v);//cin>>back_v;
		
		if(back_v <= 0)
		{
			printf("volume <= 0,program end.");
			break;
		}
		
		dynamic_programming(back_v);
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_47991812/article/details/120789215