洛谷 P1757 通天之分組背包 【分組背包】
阿新 • • 發佈:2018-05-16
() 發現 由於 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 通天之分組背包 【分組背包】