用递归遍历第一个人购买M颗红宝石的情况,在每种情况中寻找剩下的N-M颗宝石中是否有符合条件的红宝石,即使得第一个人花的钱是第二个人的两倍。代码有bug,但是不想改了。。
#include<stdio.h>
int a[1000];
int find(int n, int m, int *price){
static int count=0;
if(count==0){
for(int i=0; i<n; i++){
a[i]=1;
}
}
// 买m个宝石
for(int i=0; i<n; i++){
if(a[i]==1){
a[i] = 0;
count++;
if(count==m){
break;
}
else{
int ret = find(n, m, price);
if(ret != 0){
return ret;
}
}
a[i] = 1;
count--;
}
}
// 寻找价格组合
int sum=0;
int sum_m=0;
int new_m[n-m];
int j=0;
for(int i=0; i<n; i++){
if(a[i]==1){
new_m[j] = price[i];
j++;
sum += price[i];
}
else{
sum_m += price[i];
}
}
for(int i=0; i<(n-m); i++){
if(((sum-new_m[i])*2) == sum_m){
return new_m[i];
}
}
return 0;
}
int main(){
int n, m;
while(~scanf("%d %d", &n, &m)){
int price[n];
for(int i=0; i<n; i++){
scanf("%d", &price[i]);
}
printf("%d\n", find(n, m, price));
}
}