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) 收藏 举报

浙公网安备 33010602011771号