码迷,mamicode.com
首页 > 其他好文 > 详细

Gym101081k Pope's work

时间:2017-10-12 21:33:59      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:can   eof   efi   自己的   using   def   min   include   amp   

题意:n个箱子,每个箱子都有自己的承重和自重,它所承受的重量是承重-自重,问最多能叠几个箱子

题解:首先是承重大的一定在下面,可以证明承重大的在上面没有在下面的优,然后就是dp[i][j]代表前i个箱子碟j个的最小重量

状态转移:dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]+r[i]);

#include <bits/stdc++.h>
#define ll long long
#define maxn 1010
#define INF 0x3f3f3f3f
using namespace std;
struct node{
    int w, r;
}a[maxn];
int cmp(node aa,node bb){
    return aa.r<bb.r;
}
int dp[maxn][maxn];
int main(){
    int T, n;
    scanf("%d", &T);
    while(T--){
        memset(dp, INF, sizeof(dp));
        scanf("%d", &n);
        for(int i=0;i<=n;i++)
            dp[i][0] = 0;
        for(int i=1;i<=n;i++) scanf("%d%d", &a[i].w, &a[i].r);
        sort(a+1, a+n+1, cmp);
        //dp[i][j]前i个箱子碟j个的最小重量
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                if(i>=j-1) dp[i][j] = dp[i-1][j];
                if(dp[i][j] > dp[i-1][j-1]+a[i].w && a[i].r >= a[i].w+dp[i-1][j-1])
                    dp[i][j] = dp[i-1][j-1]+a[i].w;
            }
        }
        for(int i=n;i>=1;i--)
            if(dp[n][i]!=INF){
                printf("%d\n", i);
                break;
            }
    }
    return 0;
}

 

Gym101081k Pope's work

标签:can   eof   efi   自己的   using   def   min   include   amp   

原文地址:http://www.cnblogs.com/Noevon/p/7657901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!