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哈哈~
  • 相关阅读:
    hihocoder 1049 后序遍历
    hihocoder 1310 岛屿
    Leetcode 63. Unique Paths II
    Leetcode 62. Unique Paths
    Leetcode 70. Climbing Stairs
    poj 3544 Journey with Pigs
    Leetcode 338. Counting Bits
    Leetcode 136. Single Number
    Leetcode 342. Power of Four
    Leetcode 299. Bulls and Cows
  • 原文地址:https://www.cnblogs.com/wls001/p/4963914.html
Copyright © 2011-2022 走看看