zoukankan      html  css  js  c++  java
  • 经典背包系列问题

    背包问题I
     
    试题描述

        有一个背包容积为 V 和 n 个物品,并给出每个物品有一个体积。要求从 n 个物品中,任取若干个装入背包内,使背包的剩余空间为最小。

    输入
    第一行两个正整数 V 和 n,分别表示背包的容积和待装物品的个数;第二行包括 n 个正整数,表示 n 个物品的体积,两两之间有一个空格分隔。
    输出
    一个数,表示背包中剩余空间的最小值
    输入示例
    24 6
    8 3 12 7 9 7
    输出示例
    0
    其他说明
    数据范围:0<V≤20000,0<n≤30
    View Code
    背包问题II
     
    试题描述

    仍然是背包问题……典型0-1背包!题曰:今有n个物品,第i个体积为V[i],价值为W[i],背包的容积为C。求在体积不超容积的前提下,背包中可装物品价值的最大值。

     
    输入
    第一行:两个整数 n 和 C ;
    第二行~第n+1行:每行两个整数Vi与Wi,有一个空格分隔。
    输出
    一个数,表示背包中能得到物品价值的最大值。 
    输入示例
    2 10
    1 1
    2 2
    输出示例
    3
     1 #include<iostream>
     2 using namespace std;
     3 int a[10001]={},b[10001]={},temp1,temp2;//b[i]为上一行,a[i]为这行 
     4 int main()
     5 {
     6     int n,c;
     7     int i,j;
     8     cin>>n>>c;
     9     for(i=1;i<=n;i++)
    10     {
    11         cin>>temp1>>temp2;//输入 
    12         for(j=1;j<=c;j++)//DP 
    13         {
    14             if(j<temp1) a[j]=b[j];
    15             else{a[j]=max(b[j-temp1]+temp2,b[j]);}
    16         }
    17         for(j=1;j<=c;j++)b[j]=a[j];
    18     }
    19     cout<<b[c];
    20 }
    View Code
    背包问题III
     
    试题描述

       背包问题,古之经典。题曰:今有n类物品无数,第i种体积为V[i],价值为W[i],背包的体积为C。求在体积不超容积的前提下,背包中物品价值最大值。

    输入
    第一行:两个整数 n 和 C ;
    第二行~第n+1行:每行两个整数Vi与Wi,有一个空格分隔。
    输出
    一个数,表示背包中能得到物品价值的最大值。 
    输入示例
    4 1000
    1 1000
    2 1231
    3 1232
    4 1010
    输出示例
    1000000
    其他说明
    数据范围:1<=n<=100 1<=Vi,Wi<=100;1<=C<=10000; 
     1 #include<iostream>
     2 using namespace std;
     3 int a[2][10001]={},temp1,temp2;
     4 int main()
     5 {
     6     int n,c;
     7     int i,j;
     8     cin>>n>>c;
     9     for(i=1;i<=n;i++)
    10     {
    11         cin>>temp1>>temp2;
    12         for(j=1;j<=c;j++)
    13         {
    14             if(j<temp1) a[1][j]=a[0][j];
    15             else{a[1][j]=max(a[1][j-temp1]+temp2,a[0][j]);}
    16         }
    17         for(j=1;j<=c;j++) a[0][j]=a[1][j];
    18     }
    19     cout<<a[1][c];
    20 }
    View Code
    背包问题Ⅳ
     
    试题描述

    有n个重量和价值分别为Wi和Vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。

    输入
    三行,第一行包含两个正整数n和W,第二行包含n个正整数依次表示i个物品各自的重量,第三行包含n个正整数依次表示i个物品各自的价值。同一行的数两两之间有一个空格分隔。
    输出
    一个数,表示价值总和的最大值。
    输入示例
    4 5
    2 1 3 2
    3 2 4 2
    输出示例
    7
    其他说明
    数据范围:1<=n,Vi<=100,1<=W<=10^9,1<=Wi<=10^7.
     1 #include<iostream>
     2 using namespace std;
     3 int a[2][10005]={},t1[101],t2[101];
     4 int main()
     5 {
     6     int n,w;
     7     cin>>n>>w;
     8     for(int i=1;i<=n;i++) scanf("%d",&t1[i]);
     9     for(int i=1;i<=n;i++) scanf("%d",&t2[i]);
    10     for(int i=1;i<=n;i++)
    11     {
    12         for(int j=10001;j>=1;j--)
    13         {
    14             a[1][j]=a[0][j];
    15             if(j<t2[i]) break;
    16             if(j-t2[i]==0)
    17             {
    18                 if(a[1][j]==0) a[1][j]=t1[i];
    19                 else a[1][j]=min(a[1][j],t1[i]);
    20             }
    21             else if(a[0][j-t2[i]]!=0)
    22             {
    23                 if(!a[1][j]) a[1][j]=a[0][j-t2[i]]+t1[i];
    24                 else a[1][j]=min(a[1][j],a[0][j-t2[i]]+t1[i]);
    25             }
    26         }
    27         for(int j=1;j<=10001;j++) a[0][j]=a[1][j];
    28     }
    29     int ans=0;
    30     for(int i=1;i<=10001;i++) if(a[1][i]<=w&&a[1][i]!=0) ans=i;
    31     cout<<ans;
    32 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    一些常用编程经验
    “一键GHOST”系统备份与还原(icmzn)
    office2010安装不成功提示缺少MSXML 6.10.1129.0?
    python 的几种启动方式
    win7 环境安装Python + IDE(vs2010)开发
    U盘单个文件最大4G限制问题
    第一百零三节,JavaScript对象和数组
    第一百零二节,JavaScript函数
    第一百零一节,JavaScript流程控制语句
    第一百节,JavaScript表达式中的运算符
  • 原文地址:https://www.cnblogs.com/wls001/p/4963914.html
Copyright © 2011-2022 走看看