HDU 3033

这题属于神奇的分组背包问题,思路是:

先按brand排序 然后用两个状态转移方程
对同品牌和不同品牌稍作区别即可;

代码:

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 struct node{
 6     int b,p,v;
 7 }a[1010];
 8 int max(int a,int b)
 9 {
10     return a>b?a:b;
11 }
12 bool cmp(node a,node b)
13 {
14     return a.b<b.b;
15 }
16 int dp[12][100001];
17 int main()
18 {
19     int t,m,n,i,j,k,v;
20     while(~scanf("%d %d %d",&t,&m,&n))
21     {
22         for(i=0;i<t;i++)
23             scanf("%d %d %d",&a[i].b,&a[i].p,&a[i].v);
24         sort(a,a+t,cmp);
25         memset(dp,0,sizeof(dp));
26         for(j=0,i=0;i<t;i++)
27         {
28             if(i&&a[i].b!=a[i-1].b)
29                 j++;
30             for(v=m;v>=a[i].p;v--)
31             {
32                 dp[j][v]=max(dp[j][v],dp[j][v-a[i].p]+a[i].v);
33                 if(j)
34                     dp[j][v]=max(dp[j][v],dp[j-1][v-a[i].p]+a[i].v);
35             }
36         }
37         int s=-1;
38         for(i=0;i<=m;i++)
39             if(s<dp[j][i])
40                 s=dp[j][i];
41             if(s==0||j<n-1)
42                 puts("Impossible");
43             else
44                 printf("%d\n",s);
45     }
46     return 0;
47 }

 

 

posted on 2012-08-19 10:32  acoderworld  阅读(58)  评论(0)    收藏  举报

导航