[U]3.3.2 DP

赤裸裸的DP题,简单题。

/*
ID:bysen
LANG:C++
PROG:shopping
*/
#include<stdio.h>
using namespace std;

int ticket_No[100][6];
int ticket_Num[100][6];
int ticket_Money[100];
//票的成员,成员的数量,优惠金额


int hash[1000];
//编号映射 
int price[5];
//商品价格
int getGood[5];
//商品的数量
 
int ticketNum;
int goodNum;

int min( int a,int b ){ return a<b?a:b; }

void init()
{
 	 for( int i=0;i<1000;i++ ) hash[i]=-1;
 	 
	 int n;
 	 goodNum=0;
 	 scanf( "%d",&ticketNum );
 	 for( int i=0;i<ticketNum;i++ )
 	 {
	  	  scanf( "%d",&n );
	  	  for( int j=0;j<n;j++ )
		   	   scanf( "%d %d",&ticket_No[i][j],&ticket_Num[i][j] );//获取优惠券上的产品编号与产品数量 
  	   	  scanf( "%d",&ticket_Money[i] );
	 }
	 
	 for( int i=0;i<1000;i++ )
	 	  hash[i]=0x7FF;
	 	  
	 scanf( "%d",&goodNum );
	 for( int i=0;i<goodNum;i++ )
	 {
	  	  int no,num,p;
	  	  scanf( "%d %d %d",&no,&num,&p );
	  	  hash[no]=i;
	  	  getGood[i]=num;
	  	  price[i]=p;
     }
}

void DP()
{
 	 int a[5];
 	 int dp[6][6][6][6][6];
 	 for( a[0]=0;a[0]<=getGood[0];a[0]++ )
 	 for( a[1]=0;a[1]<=getGood[1];a[1]++ )
 	 for( a[2]=0;a[2]<=getGood[2];a[2]++ )
 	 for( a[3]=0;a[3]<=getGood[3];a[3]++ )
 	 for( a[4]=0;a[4]<=getGood[4];a[4]++ )
 	 {
	  	  dp[a[0]][a[1]][a[2]][a[3]][a[4]]=a[0]*price[0]+a[1]*price[1]+a[2]*price[2]+a[3]*price[3]+a[4]*price[4];
	  	  if( a[0]-1>=0 )
	  	  	  dp[a[0]][a[1]][a[2]][a[3]][a[4]]=min( dp[a[0]-1][a[1]][a[2]][a[3]][a[4]]+price[0],dp[a[0]][a[1]][a[2]][a[3]][a[4]] );
	  	  if( a[1]-1>=0 )
	  	  	  dp[a[0]][a[1]][a[2]][a[3]][a[4]]=min( dp[a[0]][a[1]-1][a[2]][a[3]][a[4]]+price[1],dp[a[0]][a[1]][a[2]][a[3]][a[4]] );
	  	  if( a[2]-1>=0 )
	  	  	  dp[a[0]][a[1]][a[2]][a[3]][a[4]]=min( dp[a[0]][a[1]][a[2]-1][a[3]][a[4]]+price[2],dp[a[0]][a[1]][a[2]][a[3]][a[4]] );
	  	  if( a[3]-1>=0 )
	  	  	  dp[a[0]][a[1]][a[2]][a[3]][a[4]]=min( dp[a[0]][a[1]][a[2]][a[3]-1][a[4]]+price[3],dp[a[0]][a[1]][a[2]][a[3]][a[4]] );
	  	  if( a[4]-1>=0 )
	  	  	  dp[a[0]][a[1]][a[2]][a[3]][a[4]]=min( dp[a[0]][a[1]][a[2]][a[3]][a[4]-1]+price[4],dp[a[0]][a[1]][a[2]][a[3]][a[4]] );	  
	  	  	  
	  	  for( int k=0;k<ticketNum;k++ )
	  	  {
		   	   bool flag=true;
		   	   int b[5];
		   	   for( int i=0;i<5;i++ )
		   	   		b[i]=a[i];
		   	   		
		   	   for( int i=0;ticket_No[k][i]!=0;i++ )//遍历优惠券
		   	   {
				  	if( hash[ticket_No[k][i]]>goodNum )
					  	flag=false;
					else if( b[hash[ticket_No[k][i]]]-ticket_Num[k][i]>=0 )
					{
					 	 b[hash[ticket_No[k][i]]]-=ticket_Num[k][i];
		 	 		}
		 	 		else
		 	 			flag=false;
			   } 
			   if( flag==false )
			   	   continue;
 	   		   dp[a[0]][a[1]][a[2]][a[3]][a[4]]=min( dp[b[0]][b[1]][b[2]][b[3]][b[4]]+ticket_Money[k],dp[a[0]][a[1]][a[2]][a[3]][a[4]] );
		  }
		  //printf( "[%d][%d][%d][%d][%d]=%d\n",a[0],a[1],a[2],a[3],a[4],dp[a[0]][a[1]][a[2]][a[3]][a[4]] );

	 }
	 printf( "%d\n",dp[getGood[0]][getGood[1]][getGood[2]][getGood[3]][getGood[4]] );
}

int main()
{
 	freopen( "shopping.in","r",stdin );
 	freopen( "shopping.out","w",stdout );
 	init();
 	DP();
 	return 0;
}


你可能感兴趣的:([U]3.3.2 DP)