⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 knapsack.cpp

📁 动态规划算法求解0-1背包问题,动态规划算法knapsack求最优值
💻 CPP
字号:
////动态规划算法knapsack求最优值
#include <iostream>
#include<iomanip>
#include<string.h>
using namespace std;


//返回w和c的最小值
int min(int w,int c)
{
	int temp;
	if (w < c)
		temp = w;
	else
		temp = c;
	return temp;
}

//返回w和c的最大值
int max(int w,int c)
{
	int temp;
	if (w>c) 
		temp=w;
	else
		temp=c;
	return temp;
}

//动态规划算法knapsack求最优值
void knapsack(int v[],int w[],int c,int n,int **m) //求最优值
{
	int jmax = min(w[n]-1,c);

	for(int j = 0;j <= jmax;j++)
		m[n][j] = 0;					// J >= Wn : m[n][j] = Vn
	for(int j = w[n]; j <= c; j++)
		m[n][j] = v[n];				//  0 =< J <= Wn : m[n][j] = 0;

	for(int i = n-1; i > 1; i--)   //递归部分
	{
		jmax = min(w[i] - 1,c);

		for(int j = 0; j <= jmax; j++)
			m[i][j] = m[i+1][j];			//  0 =< j <= Wi : m[i][j] = m[i+1][j]

		for(int j = w[i]; j <= c; j++)
			m[i][j] = max(m[i+1][j], m[i+1][j - w[i]] + v[i]);  // j >= Wi: m[i][jj] = max(m[i+1][jj], m[i+1][jj - w[i]] + v[i]);
	}

	m[1][c] = m[2][c];
	if(c >= w[1])
		m[1][c] = max(m[1][c], m[2][c-w[1]] + v[1]);

	cout<<"最优值:"<<m[1][c]<<endl;

	for(int l = 2; l <= n ;l++)
	{
		for(int j = 0; j<= c ;j++)
		{
			cout<<m[l][j]<< "  ";		
		} 

		cout << endl;
	}
}


///回代法求最优解
int traceback(int **m,int w[],int c,int n,int x[]) //回代,求最优解
{
	for(int i = 1; i < n; i++)
	{
		if(m[i][c] == m[i+1][c])
			x[i] = 0;
		else 
		{
			x[i] = 1;
			c -= w[i];
		}
		x[n] = (m[n][c]) ? 1:0;
	}

	cout<<"最优解:"<<endl;
	for(int y = 1; y <= n;y++)
	{
		cout<<setw(5)<<x[y];  //打印的数据如果不足5位就补足5位
	}

	cout<<endl;
	return x[n];

}

void main()
{
	int n,c;
	int **m;

	cout<<"动态规划算法求解0-1背包问题"<<endl;

	cout<<"请输入物品个数和重量上限:";
	cin>>n>>c;
	int *v=new int[n+1];

	cout<<"Pls input the property (v[i]):"<<endl;
	for(int i=1;i<=n;i++)
		cin>>v[i];
	int *w=new int[n+1];

	cout<<"Pls input the weight (w[i]):"<<endl;

	for(int j=1;j<=n;j++)
		cin>>w[j];

	int *x=new int[n+1];
	m = new int*[n+1];   //动态的分配二维数组

	for(int p = 0; p < n+1; p++)
	{
		m[p] = new int[c+1];
	} 

	cout<<"Knapsack:"<<endl;
	knapsack(v,w,c,n,m);

	cout<<"traceback:"<<endl;
	traceback(m,w,c,n,x);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -