题意: 有 n 个团队和 m 艘船,每艘船的载客量为 k,每个团队的人数为ai+1 ,转载该团队可获利润 bi,要求每个团队的所有人必须在同一艘船上,
且团队优先级高的团队所在船编号不能大于优先级低的团队,求可以获得的最大利润。
题解:其实没什么,只需要01背包就可以了,只不过优先考虑团队优先级高的。
分析:dp[i] 表示获得 i 利润时需要的最少船位,且要保证优先级高的团队优先考虑。
1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 7 #define INF 0x1f1f1f1f 8 #define v 10005 9 10 int min(int a,int b) 11 { 12 return a<b?a:b; 13 } 14 int dp[v+1]; 15 int n,m,k; 16 int cal(int num,int a) 17 { 18 int tot=(num+k-1)/k; 19 if(num+a<=tot*k) 20 return num+a; 21 return tot*k+a; 22 } 23 int main() 24 { 25 int Cas; 26 scanf("%d",&Cas); 27 while(Cas--) 28 { 29 scanf("%d%d%d",&n,&m,&k); 30 memset(dp,INF,sizeof(dp)); 31 int a,b; 32 dp[0]=0; 33 while(n--) 34 { 35 scanf("%d %d",&a, &b); 36 a++; 37 for(int i=v-1; i>=b; i--) 38 if(dp[i-b]!=INF) 39 dp[i]=min(dp[i],cal(dp[i-b],a)); 40 } 41 int i; 42 for(i=v; i>=0; i--) 43 if(dp[i]<m*k) break; 44 printf("%d ",i); 45 } 46 }