题目大意:给你每个宝石的重量,价值,从中找到k个价值和最大的宝石做成一条项链
解题思路:类似01背包,多了一个变化就是数量有了限制,用搜索处理,这题用递推数组可以过HDU的数据,但是答案却不是正确的,因为递推数组得到的答案可能偏小
AC代码如下:
#include<stdio.h>
#include<string.h>
int value[1010],height[1010],w,k,MAX,n;
int max(int a,int b)
{
return a>b?a:b;
}
void dfs(int x,int hs,int ks,int vs)
{
if(hs>w || n-x<k-ks) return ; // 第二个剪枝挺重要的,如果剩下的东西不够做项链就去掉
if(ks==k)
{
MAX=max(MAX,vs);
return ;
}
dfs(x+1,hs+height[x],ks+1,vs+value[x]);
dfs(x+1,hs,ks,vs);
return ;
}
int main()
{
int i,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(i=MAX=0;i<n;i++)
scanf("%d%d",&value[i],&height[i]);
scanf("%d",&w);
dfs(0,0,0,0);
printf("%d\n",MAX);
}
return 0;
}