1. 程式人生 > 實用技巧 >【深基12.例1】部分揹包問題

【深基12.例1】部分揹包問題

https://www.luogu.com.cn/problem/P2240

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, t;
 4 struct jb{ //金幣結構體 
 5     int m, v;//重量,價值 
 6 };
 7 jb a[105];//用於儲存n 堆金幣 
 8 double ans;//記錄答案可以拿走金幣總價值 
 9 bool cmp(jb x, jb y){//排序引數設定:單位重量金幣價值 
10     return x.v*1.0/x.m > y.v*1.0/y.m;//注意資料型別的轉換 
11 }
12 int main() 13 { 14 cin>>n>>t; 15 for(int i=0; i<n; i++) //輸入n堆金幣 16 cin>>a[i].m>>a[i].v; 17 sort(a, a+n, cmp); //按單位重量金幣價值從大到小排序 18 for(int i=0; i<n; i++){ 19 if(t>=a[i].m){ //揹包剩餘重量 和 當前堆金幣重量比較 20 ans+=a[i].v*1.0
; 21 t-=a[i].m; 22 } 23 else{ //揹包剩餘量裝不下時,分割金幣裝包 24 ans+=a[i].v*1.0/a[i].m*t; 25 t=0; 26 } 27 if(t==0)break; //揹包剩餘量為 0時結束裝包 28 } 29 cout<<fixed<<setprecision(2)<<ans; 30 return 0; 31 }