тема:
У меня есть N драгоценные камни, и планируют использовать K из них , чтобы сделать ожерелье для моей матери, но она не будет принимать ожерелье , которое является слишком тяжелым. Учитывая ценность и вес каждого драгоценного камня, пожалуйста , помогите мне найти наиболее ценное ожерелье моей матери будет принимать.
Входные данные
Первая строка ввода является число случаев.
Для каждого случая, первая строка содержит два целых числа N (N <= 20), общее количество камней, и К (К <= N), точное количество камней , чтобы сделать ожерелье.
Тогда N следуют линии, каждая из которых содержит два целых числа: а (а <= 1000), представляющих ценность каждого драгоценного камня, и B (B <= 1000), его вес.
Последняя строка каждого случая содержит целое число W, вес максимального моя мать будет принимать, W <= 1000.
ВыходДля каждого случая, выходной максимально возможное значение ожерелье.
Пример ввода
1
2 1
1 1
1 1
3
Пример вывода
1
Практика: ДФС, текущие параметры, передаваемые по камням, и в последний раз с камнем, где каждый камень от последнего запуска ищет использоваться, или тайм-аут. Потому что это первый кусок от старта ДФСА, поэтому все комбинации могут быть найдены. Распределенные в двух конечных условиях, A K есть камень был использован, один уже избыточный вес.
Код:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,a[30],b[30],w,ans,c[30],val,wei;
void dfs(int x,int K)
{
if (x>k || wei>w) return;
if (x==k && val>ans)
ans=val;
else
{
for (int i=K;i<=n;i++)
{
if (!c[i])
{
c[i]=1;
wei+=b[i];
val+=a[i];
dfs(x+1,i);
wei-=b[i];
val-=a[i];
c[i]=0;
}
}
}
}
int main()
{
int T;
cin>>T;
while (T--)
{
ans=0;
val=wei=0;
memset(c,0,sizeof(c));
cin>>n>>k;
for (int i=1;i<=n;i++)
cin>>a[i]>>b[i];
cin>>w;
dfs(0,0);
cout<<ans<<endl;
}
}