链接:点击打开链接
题意:N个国家,M个飞船每个飞船的容量是K,每个国家有a[i]+1个人,价钱是b[i],必须按照顺序上船,问获得的最大价钱
代码:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int a[105],b[205],dp[10005];
int main(){ //因为容量太大因此不能用容量进行
int t,n,m,k,i,j,num,tmp; //转移,所以用价钱进行转移
scanf("%d",&t); //dp[j]表示价钱是j的时候,最小需要
while(t--){ //的容量
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
a[i]++;
}
memset(dp,INF,sizeof(dp));
dp[0]=0;
for(i=1;i<=n;i++){
for(j=10000;j>=b[i];j--){
if(a[i]>k||dp[j-b[i]]>=INF)
continue;
tmp=dp[j-b[i]]+a[i]; //当能用已有的装下时直接加
num=(int)ceil(dp[j-b[i]]*1.0/k);//否则需要再已有的基础上再加上一个
if(tmp<=num*k)
dp[j]=min(dp[j],tmp);
else
dp[j]=min(dp[j],num*k+a[i]);
}
}
for(i=10000;i>=0;i--)
if(dp[i]<=m*k)
break;
printf("%d\n",i);
}
return 0;
}