0-1背包问题

一、实验目的

1.掌握动态规划算法解决问题的一般步骤。

2.掌握动态规划法,回溯法的原理,并能过按其原理实现解决0-1背包问题,加深了对0-1背包问题的理解。

二、问题描述

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

三、实验代码

#include <iostream>
#include <algorithm>
using namespace std;
struct item{
    int weight;//物品的重量
    int value;//物品的价值
    float va;//物品单位重量的价值
    float rate;//使用率:1代表物品完整放入,小于1代表按比例放入 
}items[100];
bool cmp(const item &a,const item &b){
    return a.va>b.va;
}
int main(){
    int n;//n件物品
    float c;//背包容量为c
    cout<<"请输入物品的数量和背包的容量:"<<endl;
    cin>>n>>c;
    cout<<"依次输入每件物品的价值和重量:"<<endl;
    //v[n]:n件物品的价值,w[n]:n件商品的重量
    float *v = new float[n];
    float *w = new float[n];
    for(int i=0;i<n;i++){
        cin>>items[i].value>>items[i].weight;
        items[i].va=items[i].value/items[i].weight;//计算单位重量价值
        items[i].rate=0;//初始化每件物品的使用率
    }
    sort(items,items+n,cmp);//按照单位重量的价值排序
    int sum=0,j=0;
    for(j=0;j<n;j++){
        if(items[j].weight<=c){//选择单位价值重量最大的并且不超过背包容量的
            items[j].rate=1;
            sum+=items[j].weight;
            c-=items[j].weight;
            cout<<"放入背包的物品:"<<"重量为:"<<items[j].weight<<"\n价值为:"<<items[j].value<<endl<<"放入比例:"<<items[j].rate<<endl;
        }
        else break;
    }
    if(j<n){//物品未装完
        items[j].rate=c/items[j].weight;//背包容量还剩c,计算出未装入的物品能装多少的比例
        sum+=items[j].rate*items[j].weight;//加上装入部分比例物品的重量
        cout<<"重:"<<items[j].weight<<"、价值:"<<items[j].value<<"被放入了背包"<<endl<<"放入比例:"<<items[j].rate<<endl;
    }
    delete[] v , w;
    return 0;
}

四、实验结果

当物品的重量小于背包容量时,输出物品的重量和价值,输出比例为1

随着放入物品数量的增加,当重量大于背包容量时,放入比例就等于(背包容量-该物品之前的重量之和)/该物品的重量

posted @ 2022-04-16 19:45  Mymcky  阅读(123)  评论(0)    收藏  举报