HDU 3033 I love sneakers!

这是我A的第一个分组背包,这就没有用优化,这是暴力的,这里优化可以先对分组进行排序,那样就会节约好多的时间;

分组背包是:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

这里我们就可以设计成一个二维数组,f[kind][money],(kind表示当前已经拥有的品牌种类数目,money 表示当前已经花费了的前

的数目)。

当前状态的来源有二:A、当前品牌数目的前提之下取最大的值;

B、在比当前品牌数目少的基础之上放一个另外品

牌的商品的最大值;

所以我们就很容易就设计出状态转移方程:

f[i][k] = Max( f[i][k] , f[i][k - price[j]] + value[j] );
f[i][k] = Max( f[i][k] , f[i-1][k - pri

View Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int f[15][100024] = {0};
int Max( int a, int b )
{
return a > b ? a : b;
}
int DP( int brand[] , int price[],int value[],int N ,int money , int K )
{
memset( f , 0 , sizeof( f ) );
for( int i = 1; i <= K ; i++ )
{
for( int j = 0 ; j < N; j++ )
{
for( int k = money ; k >= price[j] ; k -- )
{
if( brand[j]==i )
{
f[i][k] = Max( f[i][k] , f[i][k - price[j]] + value[j] );
f[i][k] = Max( f[i][k] , f[i-1][k - price[j]] + value[j] );
}
}
}
}
return f[K][money];
}
int main( )
{
int N,K ,money ,value[124],price[124],brand[124];
while( scanf( "%d%d%d",&N, &money , &K )==3 )
{
for( int i = 0 ; i < N ; i++ )
scanf( "%d%d%d",&brand[i] ,&price[i],&value[i] );
int t = DP( brand , price , value , N , money , K );
if( t == 0 ) printf( "Impossible\n" );
else printf( "%d\n",t );
}
return 0;
}


ce[j]] + value[j] );

posted @ 2012-03-10 14:54  wutaoKeen  阅读(238)  评论(0编辑  收藏  举报