洛谷P1757 通天之分組揹包
阿新 • • 發佈:2018-12-24
題目背景
直達通天路·小A歷險記第二篇
題目描述
自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<iostream> #include<algorithm> #include<cstdio> #define MAXN 1010 #define MAXM 110 using namespace std; int n,m,t=0,v[MAXN],w[MAXN],id[MAXM][MAXN],f[MAXN]; inline int read(){ int date=0,w=1;char c=0; while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();} while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();} return date*w; } int main(){ int x; m=read();n=read(); for(int i=1;i<=n;i++){ v[i]=read();w[i]=read();x=read(); id[x][++id[x][0]]=i; t=max(t,x); } for(int k=1;k<=t;k++) for(int j=m;j>=0;j--) for(int i=1;i<=id[k][0];i++){ int u=id[k][i]; if(j>=v[u]) f[j]=max(f[j],f[j-v[u]]+w[u]); } printf("%d\n",f[m]); return 0; }