• 贪心0/1背包


    贪心0/1背包

     

    题目描述

    有 一容量为weight的背包。现在要从n件物品中选取若干装入背包中,每件物品i的重量为w[i],价值为p[i]。定义一种可行的背包装载为:背包中物 品的总重量不能超过背包的容量,并且一个物品要么全部选取,要么不选取。定义最佳装载是指所装入的物品价值最高,并且是可行的背包装载。

    输入

    第1行一个整数,表示背包的重量weight
    第2行一个整数,表示n件物品
    第3行有n个整数,分别表示n个物品的重量
    第4行有n个整数,分别表示n个物品的价值

    输出

    共两行。第1行n个物品的选取状态,0表示不取,1表示取。n个状态用空格分隔,行尾无空格。第2行表示装入物品的最高价值。

    样例输入

    11
    4
    2 4 6 7
    6 10 12 13
    

    样例输出

    0 1 0 1
    23
    经典的问题
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1001;
    int n, c, MAX;//n:个数, c:容量, MAX:最大价值
    int v[maxn], w[maxn], x[maxn], last[maxn];//v 价值 w 重量 x 目前装载 last 最后装载
    void slove(int i, int cV, int cW){//i 第i个物品 cV 目前最大价值 cW 目前重量
        if(i >= n){//遍历完成
            if(cV > MAX){//更新
                MAX = cV;
                for(int i = 0; i < n; i++){
                    last[i] = x[i];
                }
            }
        }else {
            for(int j = 0; j <=1; j++){//j = 0不装, j = 1 装
                x[i] = j;
                if(cW + w[i]*j <= c){//更新
                    cW += w[i]*j;
                    cV += v[i]*j;
                    slove(i+1, cV, cW);//进行下一位
                }
    
            }
        }
    
    }
    int main(){
        ios::sync_with_stdio(false);
        cin >> c >> n;
        for(int i = 0; i < n; i++){
            cin >> w[i];
        }
        for(int i = 0; i < n; i++){
            cin >> v[i];
        }
        MAX = 0;
        slove(0, 0, 0);
        for(int i = 0; i < n-1; i++){
            cout << last[i] <<" ";
        }
        cout << last[n-1] << endl<< MAX <<endl;
    }
    View Code
  • 相关阅读:
    mysql如何修改密码,root密码忘记怎么办?
    杂碎知识点
    mysql的数据类型4---字符串类型
    mysql的数据类型3---日期与时间类型
    mysql的数据类型1---浮点和定点类型
    mysql的数据类型1---整数类型
    安卓学习简记:基础知识(一)
    使用eclipse学习java第三课
    使用eclipse学习java第二课
    一些C和C++的常见问题集锦 ----不停更新
  • 原文地址:https://www.cnblogs.com/cshg/p/5683876.html
Copyright © 2020-2023  润新知