码迷,mamicode.com
首页 > 其他好文 > 详细

经典背包系列问题

时间:2015-11-14 11:00:16      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

背包问题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

 

经典背包系列问题

标签:

原文地址:http://www.cnblogs.com/wls001/p/4963914.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!