《趣学算法》动态规划

时间:2019-11-30
本文章向大家介绍《趣学算法》动态规划,主要包括《趣学算法》动态规划使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

2019-11-30

10:05:54

#include <bits/stdc++.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define maxn 10005
#define M 105
int c[M][maxn];
int w[M],v[M];
int x[M];//x[M]表示第i个物品是否放入购物车
int main(){
    int i,j,n,W;
    cout<<"请输入物品的个数: ";
    cin>> n;
    cout<<"请输入购物车的容量:";
    cin>>W;
    cout<<"请输入每个物品的重量w 和 价值 v,用空格分开:";
    for(int i=1;i<=n;++i){
        cin>>w[i]>>v[i];
    }
    for(i=0;i<=n;++i){
        c[i][0]=0;
    }
    for(j=0;j<=W;++j){
        c[0][j] = 0;
    }
    for(i=1;i<=n;++i){
        for(int j=1;j<=W;++j){
            if(j<w[i]){//当物品重量大于购物车容量时,不放入 
                c[i][j] = c[i-1][j];
            }
            else{
                c[i][j] = max(c[i-1][j],c[i-1][j-w[i]]+v[i]);
            }
        }
    }
    cout<<"装入购物车的最大价值为: "<<c[n][W]<<endl;
    //逆向构造最优解
    j = W;
    for(i=n;i>0;--i){
        if(c[i][j]>c[i-1][j]){
            x[i]=1;
            j -= w[i];
        }else{
            x[i] = 0;
        }
    }
    cout<<"装入购物车的物品为:"<<endl;
    for(int i=1;i<=n;++i){
        if(x[i]==1){
            cout<<i<<" ";
        }
    }
    system("pause");
    return 0;
     
} 

原文地址:https://www.cnblogs.com/JasonPeng1/p/11961516.html