HDU 3033 I love sneakers!

寒假回家第一题:这几天忙家务.   o(-)_(-)o,然后累了不睡觉,竟然看电视剧,然后又无聊看不下去,每天不切题真心不习惯了,有点痒...

题意:Iserlohn 准备收集自己喜欢的运动鞋.呵呵.Iserlohn 有m 钱,然后准备去买k个品牌的运动鞋,对于每种品牌的鞋子,Iserlohn 至少要买一双,现在求Iserlohn 能买到的运动鞋子的最大价值是多少.


思路:分组背包(每组至多选一件)的延伸,这里是每组至少选一件物品

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int brands[105],cost[105],weight[105];
int inf=-99999999;
int dp[15][10005];//i:types brands  j:money
int n,m,t;//n:groups,m:money,k:types brands
void init()
{
     for(int j=0;j<=m;j++)//这样的初始化是应付花费有0的情况 
         {
                 dp[0][j]=0;  
         } 
     for(int i=1;i<=t;i++)
       for(int j=0;j<=m;j++)
         {
                 dp[i][j]=inf;     
         } 
}
void fn()
{
     for(int i=1;i<=t;i++)
        for(int k=0;k<n;k++)
           for(int j=m;j>=cost[k];j--)
               if(brands[k]==i)
                 {
                    dp[i][j]=max(dp[i][j],max(dp[i][j-cost[k]]+weight[k],dp[i-1][j-cost[k]]+weight[k]));             
                    //状态方程 
                 } 

}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
   for(int i=0;i<n;i++)
   {
       scanf("%d%d%d",&brands[i],&cost[i],&weight[i]);        
   }
   init();
   fn();
   if(dp[t][m]<0)
      printf("Impossible\n");//判断为!=0的时候.wa了.. 
   else
      printf("%d\n",dp[t][m]);
                                         
}
//system("pause");
return 0;}
 


你可能感兴趣的:(HDU 3033 I love sneakers!)