| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我也觉得是dfs暴力搜索,然后加上一些剪枝优化即可,0MSIn Reply To:最关键的是图的表示+图的遍历,没用最短路径,直接遍历0MS Posted by:zjwzh at 2011-07-24 14:20:39
#include <stdio.h>
#include <string.h>
#define MAXLEN 102
#define _abs_(a) ((a)>=0?(a):-(a))
typedef struct st_goods
{
int nPrice ;
int nLevel ;
int nAlterCount ;
int nGoodsID[MAXLEN] ;
int nGoodsOffPrice[MAXLEN] ;
}goods;
class CCaculateGoods
{
public:
void Input() ;
int Solve() ;
int dfs(int nMinlevel, int nMaxLevel,int nCosts, int nNeedGoodsID) ;
public:
int m_nGoodsCount ;
goods m_GoodsInfo[MAXLEN] ;
int m_nMaxLevelGap ;
// 当前最优解
int m_nCurOptPrice ;
int m_nGoodsVisit[MAXLEN];
};
void CCaculateGoods::Input()
{
int i ,j ;
scanf("%d%d",&m_nMaxLevelGap,&m_nGoodsCount) ;
for ( i = 0 ; i < m_nGoodsCount ;i ++)
{
scanf("%d%d%d",&m_GoodsInfo[i].nPrice,&m_GoodsInfo[i].nLevel,&m_GoodsInfo[i].nAlterCount) ;
for( j = 0 ;j < m_GoodsInfo[i].nAlterCount; j ++ )
{
scanf("%d%d",&m_GoodsInfo[i].nGoodsID[j],&m_GoodsInfo[i].nGoodsOffPrice[j]) ;
m_GoodsInfo[i].nGoodsID[j] -- ;
}
}
}
int CCaculateGoods::Solve()
{
m_nCurOptPrice = m_GoodsInfo[0].nPrice ;
memset(m_nGoodsVisit,0,sizeof(m_nGoodsVisit)) ;
return dfs(m_GoodsInfo[0].nLevel,m_GoodsInfo[0].nLevel,0,0) ;
}
int CCaculateGoods::dfs(int nMinlevel, int nMaxLevel,int nCosts, int nNeedGoodsID)
{
int nLevel , nNewCosts, i ;
// 优化
if( nCosts >= m_nCurOptPrice)
return m_nCurOptPrice ;
// 判断是否可以交易
nLevel = m_GoodsInfo[nNeedGoodsID].nLevel ;
#if 0
if( _abs_(nLevel-nMinlevel) > m_nMaxLevelGap )
return m_nCurOptPrice ;
if( _abs_(nLevel-nMaxLevel) > m_nMaxLevelGap )
return m_nCurOptPrice ;
// 是否有环路
if( m_nGoodsVisit[nNeedGoodsID] == 1)
return m_nCurOptPrice ;
#endif
// 直接买这个物品的话
nNewCosts = nCosts + m_GoodsInfo[nNeedGoodsID].nPrice ;
if( nNewCosts < m_nCurOptPrice)
m_nCurOptPrice = nNewCosts ;
nMinlevel = nMinlevel <= nLevel ? nMinlevel:nLevel ;
nMaxLevel = nMaxLevel >= nLevel ? nMaxLevel:nLevel ;
m_nGoodsVisit[nNeedGoodsID] = 1 ;
// 假如使用优惠
for( i = 0 ;i < m_GoodsInfo[nNeedGoodsID].nAlterCount; i ++)
{
//
nNewCosts = nCosts+m_GoodsInfo[nNeedGoodsID].nGoodsOffPrice[i];
if( nNewCosts >= m_nCurOptPrice)
continue ;
nLevel = m_GoodsInfo[m_GoodsInfo[nNeedGoodsID].nGoodsID[i]].nLevel ;
if( _abs_(nLevel-nMinlevel) > m_nMaxLevelGap )
continue ;
if( _abs_(nLevel-nMaxLevel) > m_nMaxLevelGap )
continue ;
if( m_nGoodsVisit[m_GoodsInfo[nNeedGoodsID].nGoodsID[i]] == 1)
continue ;
dfs(nMinlevel,nMaxLevel,nCosts+m_GoodsInfo[nNeedGoodsID].nGoodsOffPrice[i],
m_GoodsInfo[nNeedGoodsID].nGoodsID[i]) ;
}
// 恢复
m_nGoodsVisit[nNeedGoodsID] = 0 ;
return m_nCurOptPrice ;
}
int main()
{
CCaculateGoods s ;
s.Input() ;
printf("%d\n",s.Solve()) ;
return 0 ;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator