HDU-2660 Accepted Necklace(DFS)
题面
I have N precious stones, and plan to use K of them to make a necklace for my mother, but she won’t accept a necklace which is too heavy. Given the value and the weight of each precious stone, please help me find out the most valuable necklace my mother will accept.
Input
The first line of input is the number of cases.
For each case, the first line contains two integers N (N <= 20), the total number of stones, and K (K <= N), the exact number of stones to make a necklace.
Then N lines follow, each containing two integers: a (a<=1000), representing the value of each precious stone, and b (b<=1000), its weight.
The last line of each case contains an integer W, the maximum weight my mother will accept, W <= 1000.
Output
For each case, output the highest possible value of the necklace.
Sample Input
1
2 1
1 1
1 1
3
Sample Output
1
题目分析
深搜+递归,深搜即搜索选或者不选两种情况,并记录最佳选择,设置两个计数器记录已选宝石个数和已选宝石重量,搜索时遇到宝石个数和宝石重量已达要求便不再搜索。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int w[30],v[30];
int maxw;
int N,K;
int dfs(int i,int W,int k)
{
int maxv;
if(i==N||k==0){
maxv=0;
}else if(w[i]>W){
maxv=dfs(i+1,W,k);
}else{
maxv=max( dfs(i+1,W,k) , dfs(i+1,W-w[i],k-1)+v[i] );
}
return maxv;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&N,&K);
for(int i=0;i<N;i++)
{
scanf("%d%d",&v[i],&w[i]);
}
scanf("%d",&maxw);
printf("%d\n",dfs(0,maxw,K) );
}
return 0;
}