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.
#include<stdio.h> struct ston { int sa,sw; }; struct ston s[25],tem; int su,N,K,W; void DFS(int i,int suma, int w,int k) { int j; if(su<suma)//比较总价值 su=suma; if(k==K)//宝石个数不能超过K个 return ; for(j=i+1;j<=N;j++) if(s[j].sw+w<=W&&k+1<=K) DFS(j,s[j].sa+suma,s[j].sw+w,k+1); } int main() { int t,i,j,e,sum; scanf("%d",&t); while(t--) { scanf("%d%d",&N,&K); for(i=1;i<=N;i++) scanf("%d%d",&s[i].sa,&s[i].sw); scanf("%d",&W); for(i=1;i<=N;i++)//先按价值从大到小排序 { e=i; for(j=i+1;j<=N;j++) if(s[e].sa<s[j].sa) e=j; tem=s[i];s[i]=s[e];s[e]=tem; } sum=0; for(i=1;i<=N;i++)//看以那个开头总价值最大 if(s[i].sw<=W&&K>0) { su=s[i].sa; DFS(i,s[i].sa,s[i].sw,1); if(su>sum) sum=su; } printf("%d\n",sum); } }