1. 程式人生 > >洛谷 P1757 通天之分組背包 【分組背包】

洛谷 P1757 通天之分組背包 【分組背包】

() 發現 由於 problem max mes ble 分組 DC

題目鏈接:https://www.luogu.org/problemnew/show/P1757#sub

題目描述

自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

分組背包的模板題

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, m;
    cin >> m >> n;
    int dp[1010]; 
    int w[105][1005], val[105][1005], ord[1005];
    int cur = 0; int a, b, c; int maxk = 0;
    for (int i = 1; i <=n; i++)
    {    
        cin >> a >> b >> c;
        maxk 
= max(maxk, c); //記錄下組數的最大值,方便循環的時候定義邊界 ord[c]++; //第c組的第幾個物品 w[c][ord[c]] = a; //第幾組第幾個物品的重量 val[c][ord[c]] = b; } for(int k=1;k<=maxk;k++) //第k組 for (int j = m; j >= 0; j--) //背包容量 {
for (int i = 1; i <= ord[k]; i++) //該組的物品序號 { if(j>=w[k][i]) //由於j的範圍是定義為>=0的,所以要記得加上這一條語句 dp[j] = max(dp[j], dp[j - w[k][i]] + val[k][i]); } } cout << dp[m] << endl; return 0; }

2018-05-16

洛谷 P1757 通天之分組背包 【分組背包】