《趣学算法》动态规划

早过忘川 提交于 2019-12-06 04:20:12

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;
     
} 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!