用动态规划法求解0/1背包问题

【问题描述】

给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,问如何选择装入背包的物品,使得装入容量为c的背包的物品的总价值最大?

【输入形式】

第一行输入背包容量c;第二行输入要装入的物品的个数;第三行输入装入的各个物品的重量w[i];第四行输入装入的物品的价值v[i]

【输出形式】

输出背包的最大总价值

【样例输入】

6
5
3 2 1 4 5
25 20 15 40 50

【样例输出】

65

c++代码

#include<iostream>
#include<algorithm>
using namespace std;
int V[100][100] = { 0 }; //造表记录子问题的最优解
int Knapsack(int w[], int v[], int n, int C);//实际物品数目,背包容量
int main()
{
	int C;
	cin>>C;
	int n;
	cin>>n;
   int w[100]={0}; 
   int v[100]={0};
   for (int i=1;i<=n;i++)
   {
   		cin>>w[i];
	}   
	for (int i=1;i<=n;i++)
	{
		cin>>v[i];
	}
   int maxValue = Knapsack(w, v, n, C);
   cout << maxValue;
    return 0;
}
int Knapsack(int w[], int v[], int n, int C) {
   for (int i = 0; i <= n; ++i)
      V[i][0] = 0;
   for (int j = 0; j <= C; ++j)
      V[0][j] = 0;
   for(int i=1;i<=n;++i)
      for (int j = 1; j <= C; ++j)
      {
         if (j < w[i])
            V[i][j] = V[i - 1][j];
         else {
            V[i][j] = max(V[i - 1][j], V[i - 1][j - w[i]] + v[i]);
         }
      }
   return V[n][C];
}
发布了51 篇原创文章 · 获赞 4 · 访问量 4212

猜你喜欢

转载自blog.csdn.net/qq_43207916/article/details/102799676