トピック:
私はN貴重な石、そして私の母のためのネックレスを作るためにそれらのKを使用する計画を持っているが、彼女は重すぎるネックレスを受け付けません。値と各貴重な石の重さを考えると、私は私の母が受け入れる最も貴重なネックレスを見つける助けてください。
入力
入力の最初の行は、ケースの数です。
各場合について、最初の行にはネックレスを作るために2つの整数N(N <= 20)、石の数、及びK(K <= N)、石の正確な数を含んでいます。
各宝石の値、及びB(B <= 1000)、その重みを表す、(<= 1000):次いで、N行はそれぞれ、2つの整数を含む、従います。
各ケースの最後の行は整数W、私の母が受け入れる最大重量、W <= 1000が含まれ
、出力を各場合について、出力ネックレスの最高可能値。
サンプル入力
1
2 1
1 1
1 1
3
サンプル出力
1
実践:DFS、石から渡された現在のパラメータ、および最後のスタートからすべての石が使用されて探している石と最後の時間、またはタイムアウトします。それは、開始DFSからの最初の作品ですので、すべての組み合わせを見つけることができますので。両端条件でDFS、Kは1つが過体重既に、石が使用されてきています。
コード:
#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;
}
}