zoukankan      html  css  js  c++  java
  • 背包问题

    问题描述:

    有N个物品,每种物品只有一件,每个物品有一个重量w[i],和价值V[i].现在有一个背包容量为C的背包,求问把哪些物品放进背包可以获得最大价值。物品必须保证完整,不得拆分。

    解决方案:

    代码实现:

    #include<stdio.h>
    #include<algorithm> 
    using namespace std; 
    int N,M,v[50],w[50]; //请输入物品个数N和背包容量限制M,v表示该物品的价值,w表示该物品的重量 
    int ans,tot; //ans为全局的价值,tot为当前的价值 
    void dfs(int dep,int now){//now为当前的重量 
      if(now>M)return;//如果当前背包的重量>背包容量,那么返回 
      if(dep==N){//如果dep==物品的个数了 
         ans= max(ans,tot); 
         return; 
      } 
      //选取该物品,把价值记录 
      tot+=v[dep];
      dfs(dep+1,now+w[dep]); 
      //恢复选取前当前状态 
      tot-=v[dep];
      //不选出该物品 
      dfs(dep+1,now); 
    } 
    int main(){
        //读入物品个数N,背包容量限制M 
        printf("请输入读入物品个数N,背包容量限制M 
    "); 
        scanf("%d%d",&N,&M);
        //v表示该物品的价值,w表示该物品的重量  
        printf("请输入读入物品价值v,物品重量w
    "); 
        for(int i=0;i<N;i++){
           scanf("%d%d",&v[i],&w[i]); 
        }
        //令一开始的总价值是0 
        tot=0;
        dfs(0,0);
        printf("最大价值是%d
    ",ans); 
    }
  • 相关阅读:
    JZOJ1495 宝石
    JZOJ1496 页
    jzoj1497. 景点中心
    2019.8.2总结
    学习进度报告2021/3/19
    学习进度报告2021/3/18
    《学会提问》读书笔记2
    学习进度报告2021/3/17
    学习进度报告2021/3/16
    学习进度报告2021/3/15
  • 原文地址:https://www.cnblogs.com/michaeljunlove/p/3888239.html
Copyright © 2011-2022 走看看