/**//* 给出m条船,n批人,每批a[i]+1个人,让该批人上将获益b[i] 有个限制,这些船上的人必须按顺序 如第一条船上1 3 第二条串上2 4 是不合法的 因为2应排在3之前
dp[M][K]表示第M条船用了容量K的最大价值,O(NMK)的算法行不通 转化思维: dp[i]获得价值i需要最少的代价(占有的船的位置) http://blog.sina.com.cn/s/blog_677a3eb30100lkxk.html */ #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<map> #include<cmath> #include<cstdlib> #include<iostream>
using namespace std;
const int INF = 1000000000; const int MAXN = 10010;
int dp[MAXN]; int n , m , k;
int cal(int x,int y)//修改代价的累加 { int num = (x+k-1)/k; if(x+y <= num*k)return x+y; return num*k+y; }
int main() {
#ifdef ONLINE_JUDGE #else freopen("in", "r", stdin); #endif
int T; int a,b; for(scanf("%d",&T) ; T--; ) { scanf("%d%d%d",&n,&m,&k); dp[0] = 0; for(int i = 1 ; i <= 10000; i++) dp[i] = INF; for(int i = 1 ; i <= n; i++) { scanf("%d%d",&a,&b); a++;//加上president本身 for(int j = 10000 ; j>=b ; j--) { if(dp[j-b] != INF) { dp[j] = min( dp[j] , cal(dp[j-b] , a) ); } } } int ans = 10000 ; while(dp[ans] > m*k ) ans --; printf("%d\n",ans); } return 0; }
|
|
常用链接
随笔分类
Links
搜索
最新评论
|
|