题目:【HDU】 2660 ————Accepted Necklace
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2660
题目描述:给出N块宝石,每块宝石有它的价值a,重量b。选出其中K块连成项链,总重量在不超过W的前提下,选出最大价值的一条。
题目分析:由于N值不大,这道看似dp的题可以用dfs解决。
由N值来确定dfs的深度。以每一块石头为结点,dfs搜索,搜索过的剪掉。每次搜索判断并更新项链总价值sum。
代码:
#include <stdio.h>
int a[20],b[20];
int N,K,W,sum=0;
//这是dfs函数
int f(int n,int w,int v,int k) //n表示当前深度(也就是宝石数)
{ //w表示当前重量 v表示当前价值
//k表示当前下当前判断宝石的价值
int i;
if(n>K||w>W) return 0; //当数量和重量超标时,结束搜索
if(v>sum) sum=v; //更新sum
for(i=k;i<N;i++) //这个循环列出了还没用上宝石的结点
f(n+1,w+b[i],v+a[i],i+1);
return 0;
}
int main()
{
int i,m;
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&N,&K);
for(i=0;i<N;i++)
{
scanf("%d%d",a+i,b+i);
}
scanf("%d",&W);
f(0,0,0,0); //开始dfs
printf("%d\n",sum);
}
return 0;
}