zoukankan      html  css  js  c++  java
  • 8.18 二讲背包问题之完全背包

      今天为大家讲解完全背包问题。

      完全背包和01背包的区别便在于完全背包可以无限选取商品,而01背包只可以选取一个,从一维数组的角度来想,01背包从后往前枚举(m到w[i])可以保证每次j空间时只选取该商品选取了一次,避免了重复;而完全背包从前往后枚举(w[i]到m)会把小于m的2*w[i],3*w[i]...k*w[i]都加进来.

    为大家放一道例题

    题目描述

    设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

    输入

    第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 

    第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。 

     

    输出

    仅一行,一个数,表示最大总价值。

    样例输入

    10 4
    2 1
    3 3
    4 5
    7 9

     

    样例输出

    max=12
    题解代码:
    #include<iostream>
    using namespace std;
    int m,n,dp[205],w[35],c[35];
    int main(){
     scanf("%d%d",&m,&n);
     for(int i=1;i<=n;i++){
      scanf("%d%d",&w[i],&c[i]);
     }
     for(int i=1;i<=n;i++){
      for(int j=w[i];j<=m;j++){
       dp[j]=max(dp[j-w[i]]+c[i],dp[j]);
      }
     }
     printf("max=%d",dp[m]);
     return 0;
    }
     
  • 相关阅读:
    2013暑假集训B组训练赛第二场
    2013暑假集训B组训练赛第二场
    2013暑假集训B组训练赛第二场
    2013暑假集训B组训练赛第二场
    SPOJ ANARC05H 计数DP
    HDU 2586 LCA-Tarjan
    POJ 1330 LCA最近公共祖先 离线tarjan算法
    Codeforces 176B 经典DP
    UVA 10564 计数DP
    HDU 4901 多校4 经典计数DP
  • 原文地址:https://www.cnblogs.com/cxs070998/p/11371089.html
Copyright © 2011-2022 走看看