zoukankan      html  css  js  c++  java
  • P1757 通天之分组背包

    题目描述

    自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。

    输入输出格式

    输入格式:

    两个数m,n,表示一共有n件物品,总重量为m

    接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数

    输出格式:

    一个数,最大的利用价值

    输入输出样例

    输入样例#1: 复制
    45 3
    10 10 1
    10 5 1
    50 400 2
    输出样例#1: 复制
    10

    说明

    1<=m<=1000 1<=n<=1000 组数t<=100

    // 去吧!皮卡丘! 把AC带回来!
    //      へ     /|
    //   /\7    ∠_/
    //   / │   / /
    //  │ Z _,< /   /`ヽ
    //  │     ヽ   /  〉
    //  Y     `  /  /
    //  イ● 、 ●  ⊂⊃〈  /
    //  ()  へ    | \〈
    //   >ー 、_  ィ  │ //
    //   / へ   / ノ<| \\
    //   ヽ_ノ  (_/  │//
    //    7       |/
    //    >―r ̄ ̄`ー―_
    //**************************************
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define inf 2147483647
    const ll INF = 0x3f3f3f3f3f3f3f3fll;
    #define ri register int
    template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); }
    template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); }
    template <class T> inline T min(T a, T b, T c, T d) {
      return min(min(a, b), min(c, d));
    }
    template <class T> inline T max(T a, T b, T c, T d) {
      return max(max(a, b), max(c, d));
    }
    #define scanf1(x) scanf("%d", &x)
    #define scanf2(x, y) scanf("%d%d", &x, &y)
    #define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
    #define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
    #define pi acos(-1)
    #define me(x, y) memset(x, y, sizeof(x));
    #define For(i, a, b) for (int i = a; i <= b; i++)
    #define FFor(i, a, b) for (int i = a; i >= b; i--)
    #define bug printf("***********
    ");
    #define mp make_pair
    #define pb push_back
    const int maxn = 3e5 + 10;
    const int maxx = 1e6 + 10;
    // name*******************************
    int n, m;
    int w[1005], v[1005];
    int num[105][1005];
    int ans = 0;
    int dp[1005];
    int x;
    int T = 0;
    // function******************************
    
    //***************************************
    int main() {
      // ios::sync_with_stdio(0); cin.tie(0);
      // freopen("test.txt", "r", stdin);
      //  freopen("outout.txt","w",stdout);
      cin >> m >> n;
      For(i, 1, n) {
        cin >> w[i] >> v[i] >> x;
        T = max(T, x);
        num[x][++num[x][0]] = i;  //num[i][j]数组用来定位,0号位存个数,很厉害的操作学习一下
      }
      For(i, 1, T) {
        FFor(j, m, 0) { //逆序
          For(k, 1, num[i][0]) {
            if (j - w[num[i][k]] >= 0)
              dp[j] =
                  max(dp[j], dp[j - w[num[i][k]]] + v[num[i][k]]);
          }
        }
      }
      cout << dp[m];
    
      return 0;
    }
  • 相关阅读:
    第2讲——处理数据
    第1讲——用C++写一个程序
    数论18——反演定理(莫比乌斯反演)
    数论17——反演定理(二项式反演)
    数论16——母函数
    数论15——抽屉原理
    数论14——容斥原理
    数论13——康托展开
    com.opensymphony.xwork2.config.ConfigurationManager.addConfigurationProvider
    Tomcat的杂七杂八
  • 原文地址:https://www.cnblogs.com/planche/p/8597500.html
Copyright © 2011-2022 走看看