zoukankan      html  css  js  c++  java
  • The Highest Mark---hdu5501(问题转化 01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5501

     二维数组:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define N 3100
    int dp[N][N];
    struct node
    {
        int A, B, C;
    }a[N];
    
    int cmp(node p, node q)
    {
        return p.C*q.B < p.B*q.C;
    }
    int main()
    {
        int T, n, t;
        scanf("%d", &T);
        while(T--)
        {
            memset(a, 0, sizeof(a));
            memset(dp, 0, sizeof(dp));
            scanf("%d%d", &n, &t);
            for(int i=0; i<n; i++)
            {
                scanf("%d%d%d", &a[i].A, &a[i].B, &a[i].C);
            }
            sort(a, a+n, cmp);
            int ans = 0;
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<=t; j++)
                {
                    if(j<a[i].C)
                        dp[i+1][j] = dp[i][j];
                    else
                        dp[i+1][j] = max(dp[i][j], dp[i][j-a[i].C]+a[i].A-j*a[i].B);
                    ans=max(dp[i+1][j],ans);
                }
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code

     一维数组:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define N 3100
    int dp[N];
    struct node
    {
        int A, B, C;
    }a[N];
    
    int cmp(node p, node q)
    {
        return p.C*q.B < p.B*q.C;
    }
    int main()
    {
        int T, n, t;
        scanf("%d", &T);
        while(T--)
        {
            memset(a, 0, sizeof(a));
            memset(dp, 0, sizeof(dp));
            scanf("%d%d", &n, &t);
            for(int i=0; i<n; i++)
            {
                scanf("%d%d%d", &a[i].A, &a[i].B, &a[i].C);
            }
            sort(a, a+n, cmp);
            int ans = 0;
            for(int i=0; i<n; i++)
            {
                for(int j=t; j>=a[i].C; j--)
                {
                    dp[j] = max(dp[j], dp[j-a[i].C]+a[i].A-j*a[i].B);
                    ans = max(ans, dp[j]);
                }
    
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    POJ 1265 Pcik定理
    POJ 1380 坐标旋转
    POJ 1788
    POJ 3714 平面最近点对
    POJ 1905 二分
    POJ 1151 矩形面积并
    POJ 1654 多边形面积
    ZOJ 1010 判断简单多边形+求面积
    about work
    Python 打印 不换行
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4871169.html
Copyright © 2011-2022 走看看