經典揹包系列問題

揹包問題I
 
試題描述

    有一個揹包容積爲 V 和 n 個物品,並給出每一個物品有一個體積。要求從 n 個物品中,任取若干個裝入揹包內,使揹包的剩餘空間爲最小。ios

輸入
第一行兩個正整數 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。求在體積不超容積的前提下,揹包中可裝物品價值的最大值。ide

 
輸入
第一行:兩個整數 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。求在體積不超容積的前提下,揹包中物品價值最大值。spa

輸入
第一行:兩個整數 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的物品,求全部挑選方案中價值總和的最大值。code

輸入
三行,第一行包含兩個正整數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
相關文章
相關標籤/搜索