zoukankan      html  css  js  c++  java
  • Gym101081k Pope's work

    题意: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
    ", i);
                    break;
                }
        }
        return 0;
    }
  • 相关阅读:
    DOM官方文档学习总结
    python安装BeautifulSoup库解析HTML页面
    操作datatable数据
    aod.net连接字符串大全
    jqery对于select的操作
    希尔排序算法
    冒泡排序算法
    归并排序(分治法)
    随机函数
    【题解】LibreOJ #6279. 数列分块入门 3
  • 原文地址:https://www.cnblogs.com/Noevon/p/7657901.html
Copyright © 2011-2022 走看看