洛谷——P1757 通天之分组背包

https://www.luogu.org/problem/show?pid=1757#sub

题目背景

直达通天路·小A历险记第二篇

题目描述

自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。

输入输出格式

输入格式:

 

两个数m,n,表示一共有n件物品,总重量为m

接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数

 

输出格式:

 

一个数,最大的利用价值

 

输入输出样例

输入样例#1:
input: 45 4
        10 10 1
        10 5 1
        5 20 2
        50 400 2
输出样例#1:
output:30

说明

1<=m<=1000 1<=n<=1000 组数t<=100

 

裸地分组背包

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int m,n,x,y,num,max_num;
 7 int a[10005],w[1015][1015],val[1015][1015];
 8 int f[10105];
 9 
10 int main()
11 {
12     scanf("%d%d",&m,&n);
13     for(int i=1;i<=n;i++)
14     {
15         scanf("%d%d%d",&x,&y,&num);
16         max_num=max(max_num,num);
17         a[num]++;
18         w[num][a[num]]=x;
19         val[num][a[num]]=y;
20     }
21     for(int i=1;i<=max_num;i++)
22         for(int k=m;k>0;k--)
23             for(int j=1;j<=a[i];j++)
24             if(k-w[i][j]>=0)
25             f[k]=max(f[k],f[k-w[i][j]]+val[i][j]);
26     printf("%d",f[m]);
27     return 0;
28 }

 

posted @ 2017-04-18 21:32  Aptal丶  阅读(241)  评论(0编辑  收藏  举报