洛谷 P1757 通天之分组背包

题目背景

直达通天路·小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<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;
}

 

posted @ 2017-11-30 20:01  一蓑烟雨任生平  阅读(139)  评论(0编辑  收藏  举报