• 洛谷1417(排序后背包)


    一看很像背包,然而值却是会随时间递减的(a - t*b),不能满足无后效性,于是考虑常用手段,先按照优先级排序。

    这个优先级怎么定呢?列式子模拟一下。

    洛谷题解说得很好了:

    说来惭愧,其实这种“组合式”排序我也是第一次见,虽然很好理解:

    1     bool operator < (const food& rhs) const {
    2         return (long long)b * rhs.c > (long long)rhs.b * c;
    3     }

    最后记得各种longlong。

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int maxn = 55;
     6 int T, n;
     7 long long dp[100005], ans;
     8 struct food {
     9     int a, b, c;
    10 
    11     bool operator < (const food& rhs) const {
    12         return (long long)b * rhs.c > (long long)rhs.b * c;
    13     }
    14 }f[maxn];
    15 
    16 int main() {
    17     ios_base::sync_with_stdio(0);
    18     cin.tie(0);
    19     cout.tie(0);
    20 
    21     cin >> T >> n;
    22     for (int i = 1; i <= n; i++)    cin >> f[i].a;
    23     for (int i = 1; i <= n; i++)    cin >> f[i].b;
    24     for (int i = 1; i <= n; i++)    cin >> f[i].c;
    25     sort(f + 1, f + 1 + n);
    26 
    27     for (int i = 1; i <= n; i++) {
    28         for (int j = T; j >= f[i].c; j--) {
    29             dp[j] = max(dp[j], dp[j - f[i].c] + f[i].a - (long long)j * f[i].b);
    30             ans = max(ans, dp[j]);
    31         }
    32     }
    33     cout << ans << endl;
    34     return 0;
    35 }
  • 相关阅读:
    管理这门技术和艺术
    主流双核处理器对比
    20111226自然醒
    message_t
    安装 SQL Server 2008 Management Studio Express
    Linux Ext2/Ext3/Ext4 文件系统分区
    多版本火狐共存方案及火狐配置文档高级管理技巧[转自火狐社区]
    心理学,慢慢学
    system pause in C#
    play with js
  • 原文地址:https://www.cnblogs.com/AlphaWA/p/10598893.html
Copyright © 2020-2023  润新知