2 solutions

  • 2
    @ 2024-4-10 16:58:26

    本题和#A1272. 【例9.16】分组背包的题意和思路(看这里)一样,拿过来改改就能 AC

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[1005],f[1005][1005],w[1005],v[1005];
    int main(int argc, char **argv){
    	int m,n,t = 0;
    	cin >> m >> n;
    	for (int i = 1;i <= n;i++){
    		int p;
    		cin >> w[i] >> v[i] >> p;
    		t = max(t,p);
    		f[p][++f[p][0]] = i;	// f[p][0] 是存第 p 组有多少个物品
    	}
    	for(int p = 1;p <= t;p++){	// 遍历组(拿出每组的最大价值)
    		// 循环内外不能错!!
    		for (int i = m;i > 0;i--){	// 遍历重量
    			for (int j = 1;j <= f[p][0];j++){	// 遍历本组的物品
    				if (i >= w[f[p][j]])	// 最大重量要够才能装下
    				a[i] = max(a[i - w[f[p][j]]] + v[f[p][j]],a[i]);
    			}
    		}
    	}
    	cout << a[m];
    	return 0;
    }
    
    
    • 1
      @ 2024-3-23 22:43:53
      #include <cstdio>
      #include <cstring>
      #include <iostream>
      #include <algorithm>
      #include <cmath>
      
      using namespace std;
      
      int n,m,a[1010],b[1010],c[110][1010],maxn;
      int f[1010];
      
      int main()
      {
          scanf("%d%d",&m,&n);
          for (int i = 1; i <= n; i++)
          {
              int t;
              scanf("%d%d%d",&a[i],&b[i],&t);
              maxn = max(maxn,t);
              c[t][++c[t][0]] = i;
          }
          for (int i = 1; i <= maxn; i++)
          for (int j = m; j >= 0; j--)
          for (int k = 1; k <= c[i][0]; k++)
          if (j - a[c[i][k]] >= 0)
          f[j] = max(f[j],f[j - a[c[i][k]]] + b[c[i][k]]);
          printf("%d\n",f[m]);
          return 0;
      }
      ```
      
      ```
      
      • 1

      Information

      ID
      1033
      Time
      1000ms
      Memory
      128MiB
      Difficulty
      6
      Tags
      # Submissions
      30
      Accepted
      11
      Uploaded By