zoukankan      html  css  js  c++  java
  • 动态规划_0-1背包问题

         0-1背包问题是一个经典的问题,可以用动态规划以线性的时间解决,相比于蛮力求解,动态规划的各项性能都比较好。关于0-1背包问题的具体解释请见下面这篇博客:

          http://www.cnblogs.com/Christal-R/p/Dynamic_programming.html

        这篇博客对0-1背包问题的分析很透彻,也提出了自己的改进算法,我就不做具体论述,我借鉴其中的思想,写下一下代码

    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<utility>    //为返回两个一维数组,使用pair
    using namespace std;
    
    int number;  //商品个数
    int capacity;  //背包容量
    
    int* item = new int[number + 1];
    
    
    pair<int*, int*> Create()
    {
    	
    	int* w = new int[number + 1];
    	int* v = new int[number + 1];
    
    	for (int i = 1; i <= number; i++)
    	{
    		w[i] = i + 1;
    		v[i] = i + 2;
    	}
    	pair<int*, int*> result(w, v);
    	return  result;
    }
    
    
    
    
    int** Knapsack_Problem( pair<int*, int*> result)
    {	
    	int** V = new int*[number + 1];
    	for (int z = 0; z <= number; z++)
    		V[z] = new int[capacity + 1];
    
    	for (int x = 0; x <= number; x++)
    		V[x][0] = 0;
    
    	for (int y = 0; y <= capacity; y++)
    		V[0][y] = 0;
    
    
    	int i, j;
    	for(int i = 1;i<=number; i++)
    	{
    		for (j = 1; j <= capacity; j++)
    		{
    			if (j < result.first[i])  //装不下
    			{
    				V[i][j] = V[i - 1][j];
    			}
    			else  //装的下
    			{
    				V[i][j] = max(V[i - 1][j],V[i - 1][j - result.first[i]] + result.second[i]);
    			}
    		}
    	}
    
    	return V;
    }
    
    
    void FindWhat(int i,int j,int** V,int* item, pair<int*, int*> result)
    {
    	if (i > 0 && j>0)
    	{
    		if (V[i][j] == V[i - 1][j])//相等说明没装
    	        {
    	            item[i] = 0;//全局变量,标记未被选中
    	            FindWhat(i - 1, j,V, item, result);
    	        }
           else if (j - result.first[i] >= 0 && V[i][j] == V[i - 1][j - result.first[i]] + result.second[i])
    	        {
    	            item[i] = 1;//标记已被选中
    	           FindWhat(i - 1,j- result.first[i], V, item, result);//回到装包之前的位置
    	        }
    	}
    }
    
    void printf(int* item)
    {
    	for (int i = 0; i <= number; i++)
    	{
    		if (item[i] == 1)
    		{
    			cout << i << "号" << "	";
    		}
    	}
    	cout << endl;
    }
    
    int main()
    {
    	cout << "plase enter the number of goods: " << endl;
    	cin >> number;
    	cout << "plase enter the capacity of knapsack: " << endl;
    	cin >> capacity;
    
    	pair<int*, int*> result = Create();
    	int** V = Knapsack_Problem(result);
    
    	for (int i = 0; i <= number; i++)
    	{
    		for (int j = 0; j <= capacity; j++)
    		{
    			cout << V[i][j] << "	";
    		}
    		cout << endl;
    	}
    
    	
    	for (int i = 0; i <= number; i++)
    	{
    		item[i] = 0;
    	}
    
    	FindWhat(number, capacity, V, item, result);
    	cout << "最大价值为" << V[number][capacity] << endl;
    	cout << "商品号码为" << endl;
    	printf(item);
    
    	return 0;
    }
    

      动态规划算法在很多问题上都有很好的应用,理解其中的原来至关重要

           夜深了,你在哪里

  • 相关阅读:
    nginx 附件上传不上去 client_max_body_size 设置的太小
    python 1
    NGINX 常用配置
    Linux OOM Killer 保护机制
    MacbookPro接上HDM连接显示器不能上网的解决方法
    python 逻辑运算符 () > not > and > or
    TASSL 服务端 客户端测试代码
    SSL通信双方如何判断对方采用了国密
    C/S boringSSL那点事
    从Chrome源码看浏览器的事件机制
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/7528164.html
Copyright © 2011-2022 走看看