洛谷 P1757 通天之分组背包
题目背景
直达通天路·小A历险记第二篇
题目描述
自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。
输入输出格式
输入格式:
两个数m,n,表示一共有n件物品,总重量为m
接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数
输出格式:
一个数,最大的利用价值
输入输出样例
说明
1<=m<=1000 1<=n<=1000 组数t<=100
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 1002 using namespace std; int n,m,k,ans; int dp[MAXN][MAXN]; int w[MAXN],v[MAXN],c[MAXN]; int dfs(int i,int j){ if(dp[i][j]!=-1) return dp[i][j]; if(i==n+1) return ans=0; if(j<w[i]||c[i]==c[i-1]) ans=dfs(i+1,j); else ans=max(dfs(i+1,j),dfs(i+1,j-w[i])+v[i]); return dp[i][j]=ans; } int main(){ memset(dp,-1,sizeof(dp)); cin>>m>>n; int i; for(i=1;i<=n;i++) cin>>w[i]>>v[i]>>c[i]; cout<<dfs(1,m)<<endl; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。