Accepted Necklace
http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=12573&pid=1006
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 11 Accepted Submission(s) : 4
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
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
Sample Input
1 2 1 1 1 1 1 3
Sample Output
1
Source
#include<iostream>
using namespace std;
int visited[25],weight[25],value[25];
int N,K,W;
int maxval; //最优解
void dfs(int p,int num,int val,int wei ){ //p表示当前状态,初始化是1
if(num==K)
if(val>maxval)
maxval=val;
for(int i=p;i<=N;i++){
if(!visited[i]){
if((num+1)<=K && (wei+weight[i])<=W ){ //这一步剪枝
visited[i]=1;
dfs(i+1,num+1,val+value[i],wei+weight[i]);
visited[i]=0;
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
maxval=0;
scanf("%d%d",&N,&K);
for(int i=1;i<=N;i++)
visited[i]=0,scanf("%d%d",&value[i],&weight[i]);
scanf("%d",&W);
dfs(1,0,0,0);
printf("%d\n",maxval);
}
return 0;
}