动态规划实现0-1背包问题

 1.题目要求

动态规划实现0-1背包在固定容量c的情况下获得最大价值问题,输出可容纳的最大价值,输入物品种类、背包容量、物品重量和价值,输出最大价值。

格式要求可参考如下:

输入:  

      请输入物品种类n,并按Enter换行:5

      请输入背包容量c,并按Enter换行:10

      请输入n个物品的重量,中间以英文逗号隔开,按Enter结束:1,4,2,5,2

      请输入n个物品的价值,中间以英文逗号隔开,并按Enter结束: 1,6,5,3,1

输出:12

2.完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

int c[10][100];//对应每种情况的最大价值
//实现功能
int knapsack(int m, int n) {
    char q;//实现键入数字“,”隔开 
    int i, j,w[10], p[10];
    cout << "请输入"<<n<<"个物品的重量(中间以英文逗号隔开):" << endl;
    //输入数组逗号隔开的实现1
    vector<int> a;
    string str1;
    cin >> str1;
    for (int i = 0; i < str1.size(); i++) {
        if (str1[i] != ',') a.push_back((int)str1[i] - 48);
    }
    for (int i = 0; i < a.size(); i++) {
        w[i]=a[i];//w[i]是需求数组
    }
    cout << "请输入" << m << "个物品的价值(中间以英文逗号隔开):" << endl;
    //输入数组逗号隔开的实现2
    vector<int> b;
    string INPUT;
    cin >> INPUT;
    for (int i = 0; i < INPUT.size(); i++) {
        if (INPUT[i] != ',') b.push_back((int)INPUT[i] - 48);
    }
    for (int i = 0; i < b.size(); i++) {
        p[i]= b[i];//p[i]是需求数组
    }
    
    for (i = 0; i < 10; i++)
        for (j = 0; j < 100; j++)
            c[i][j] = 0;//初始化数组
    cout << "----------动态规划表-----------   " << "\n  |" << endl;;
    for (j = 0; j <= m; j++)
        cout<<j<<" ";
    cout << "\n----------------------------" << "\n" << endl;
    for (i = 0; i <= n; i++)
    {
        cout<<i << " ";
        for (j = 0; j <= m; j++)
        {
            if (i == 0 || j == 0) {
                cout<<c[i][j] << " ";
                continue;
            }
            if (w[i] <= j) //如果当前物品的容量小于背包容量
            {
                if (p[i] + c[i - 1][j - w[i]] > c[i - 1][j])
                    /*如果本物品的价值加上背包剩下的空间能放的物品的价值*/
                    /*大于上一次选择的最佳方案则更新c[i][j]*/
                    c[i][j] = p[i] + c[i - 1][j - w[i]];
                else
                    c[i][j] = c[i - 1][j];
            }
            else /*如果当前物品的容量小于背包容量,即此物品装不下!*/
                c[i][j] = c[i - 1][j];//i表示物品总共的个数,j表示背包的载重量 ,c[i][j]就是当前的价值 
            cout << c[i][j] << " ";
        }
        cout<<endl;
    }
    cout<<"------------------------------"<<"\n" << endl;
    return c[n][m];     //n代表物品总共的个数,m表示背包的载重量,c[n][m]就是当前的价值               
}int main(void)
{
    
    int c, n; 
    int i, j;
    cout<<"请物品的种类n:"<<endl;
    cin>>n;
    cout << n << endl;
    cout << "请输入背包容量c:" << endl;
    cin >> c;
    cout << c << endl;
    cout<<"旅行者背包能装的最大总价值为:"<< knapsack(c, n)<<endl;
    cout<<endl;
    system("pause");
    return 0;
}

3.运行结果

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值