题目大意:输入三个整数t,n,k,分别表示测试用例数、宝石的种类数以及母亲所能接受的最大的重量。接下来的n行,每行有2个整数,分别表示每种宝石的价值及重量。
最后一行为母亲所能接受的保湿的最大重量
解题思路:简单的DFS
代码如下:
/*
* 2660_2.cpp
*
* Created on: 2013年8月22日
* Author: Administrator
*/
#include <iostream>
using namespace std;
/**
* t: 测试用例数
* n: 宝石的种类数
* k: 所能会用的宝石的数量
* sum_val: 局部的最大价值
* sum_weight: 局部的总重量
* max_val: 全局的最大价值
* max_weight: 母亲多能接受的最大重量
*
* PS: 章泽天,我的女神!!!!!!
*/
int t;
int n,k;
int sum_val,sum_weight;
int max_val,max_weight;
struct Node{
int val;
int weight;
bool visited;
};
Node a[21];
void dfs(int start , int count){
//如果当前总重量>全局总重量
if(sum_weight > max_weight){
return ;
}
//如果已经使用的石头数量>所能使用的石头数量
if(count > k){
return ;
}
//结束点: 已经使用的石头数量 == 所能使用的石头数量
if(count == k){
//如果局部最大价值 > 全局最大价值
if(max_val < sum_val){
max_val = sum_val;
}
return ;
}
int i;
for( i = start ; i <= n ; ++i){
if(!a[i].visited){
sum_val += a[i].val;
sum_weight += a[i].weight;
a[i].visited = true;
dfs(i+1,count+1);
sum_val -= a[i].val;
sum_weight -= a[i].weight;
a[i].visited = false;
}
}
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
int i;
for( i = 1 ; i <= n ; ++i){
scanf("%d%d",&a[i].val,&a[i].weight);
a[i].visited = false;
}
scanf("%d",&max_weight);
sum_val = 0;
sum_weight = 0;
max_val = 0;
dfs(1,0);
printf("%d\n",max_val);
}
}