跳跳的书包
**問題 F: 跳跳的書包
題目描述
n個物品,已知每個物品的重量,書包的承重固定,每個書包最多放兩個物品,可以放一個物品或者兩個物品。顯然總重量要求總不超過書包承重,假設每個物品的重量也不超過書包承重,問最少需要幾個書包?
輸入
第一行包含兩個正整數n (0<n<=10000)和m (0<m<=2000000000),表示物品個數和書包的承重。
接下來n行,每行一個正整數,表示每個物品的重量。重量不超過1000000000,并且每個物品的重量不超過m。
輸出
輸出一行,一個整數表示最少需要的書包個數。
樣例輸入
3 6
1
2
3
樣例輸出
2
題意描述:
求裝n個物品最少需要幾個背包(背包最多能裝兩件物品且不能超過背包所承受的重量)。
解題思路:
1、先將n個物品進行排序,在將最小重量物品和最大重量物品加在一起,判斷是否能裝在一個背包中,若不能背包數加1,在判斷最小和第二大物品,以此類推。
2、先排下序,兩頭進行,遇到裝不下的情況就把重量大的單獨裝入一個背包,因為當前的另一個物品已經是重量最小的,所以不能把兩個物品裝入一個背包,還有就是要考慮最后還剩下一個物品的情況,這時肯定還要用一個背包。
程序代碼:
代碼一
代碼二
#include<stdio.h> #include<algorithm> using namespace std; int a[10020]; int main() {int n,m,i,sum,ans,j;while(scanf("%d%d", &n, &m)!=EOF){sum=0;ans=0;for(i=0;i<n;i++)scanf("%d",&a[i]);sort(a,a+n);i=0;j=n-1;while(i<=j){if(a[i]+a[j]<=m){ans++;i++;j--;}else if(i==j){sum++;break;}else {j--;sum++;} }printf("%d\n",ans+sum);}return 0; }總結
- 上一篇: 数据转换成tfrecord类型并完成读取
- 下一篇: 教您在Xshell中清除历史记录