题目链接:http://codeforces.com/problemset/problem/339/C
题目大意:
有不同质量的砝码无限多个,现在只让你在天平两边放入m个,要求
1.每次在天平放一个,一次左边,下一次右边
2.相邻两次质量必须不同
3.放入砝码后,保证放入的这边总重严格大于另外一边。
题目求解:简单的dfs即可~
#include<iostream>
using namespace std;
int dfs(int step,int left,int right,int last,int record[],const int m,const int b[],const int jmax)
{
int cur = (step%2 == 0)?right:left;
int other = (step%2 == 1)?right:left;
if(step > m)
{
return 0;
}
for(int j = 1; j <= jmax;j++)
{
if((last != b[j] || last == 0) && b[j]+cur>other)
{
int ltemp = left,rtemp = right;
if(left == cur)
ltemp += b[j];
else
rtemp += b[j];
record[step] = b[j];
if(step == m)
{
cout<<"YES"<<endl;
for(int i = 1; i <= m;i++)
{
if(i<m) cout<<record[i]<<" ";
else cout<<record[i];
}
return 1;
}
if(dfs(step+1,ltemp,rtemp,b[j],record,m,b,jmax)) return 1;
record[step] = 0;
}
}
return 0;
}
int main()
{
char s[20];
cin>>s;
int b[11] = {0};
int record[1002] = {0};
int j = 1;
for(int i = 0; i<= 9;i++)
{
if(s[i] == '1') b[j++] = i+1;
}
int jmax = j-1;
int m;
cin>>m;
if(dfs(1,0,0,0,record,m,b,jmax) == 0) cout<<"NO";
return 0;
}