1 2 1 1 1 1 1 3
1
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
const int MAX = 21;
typedef struct Stone{
int value;
int weight;
}Stone;
Stone stone[MAX];
int visit[MAX];
int maxv,limit,k,n;
void dfs(int v,int w,int x,int cnt){
if(w>limit || cnt>k)return;
if(cnt==k){
if(v>maxv){
maxv=v;
}
return;
}
int i;
//这个地方下标直接从x开始,因为宝石并没有要求序列问题只是求价值和,所以不需要考虑重复情况,是个很大的剪枝
//举例: 3 4 5 6 == 4 3 5 6 == 5 3 6 4虽然序列不同,但是价值和相同,这样的只需要搜一次即可也就是前面搜过的重量不再搜
for(i=x;i<n;++i){
if(visit[i]==0){
visit[i]=1;
dfs(v+stone[i].value,w+stone[i].weight,i,cnt+1);
visit[i]=0;
}
}
}
int main(){
int t,i;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t-- && scanf("%d %d",&n,&k)!=EOF){
for(i=0;i<n;++i){
scanf("%d %d",&stone[i].value,&stone[i].weight);
}
scanf("%d",&limit);
maxv = INT_MIN;
memset(visit,0,sizeof(visit));
for(i=0;i<n;++i){
visit[i]=1;
dfs(stone[i].value,stone[i].weight,i,1);
visit[i]=0;
}
printf("%d\n",maxv);
}
return 0;
}
HDU 2660 Accepted Necklace (DFS),布布扣,bubuko.com
HDU 2660 Accepted Necklace (DFS)
原文:http://blog.csdn.net/iaccepted/article/details/23036963