原题:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1420
时间:2014.1.31
类型:回溯,递归,dfs
源码:
#include<cstdio>
#include<iostream>
using namespace std;
int k,s,w[101],bag[101],p=0;
bool ans=false,u[101]={false};
void print()
{
for(int i=1;i<p;i++) { printf("%d ",bag[i]); }
printf("%d",bag[p]);
}
void put(int l)
{
if(ans) return;
if(l==0) { ans=true; print(); return;}
for(int i=1;i<=k;i++)
{
if(u[i]||w[i]>l) { continue; }
++p;
bag[p]=w[i];
u[i]=true;
put(l-w[i]);
--p;
u[i]=false;
}
}
int main()
{
scanf("%d %d",&k,&s);
for(int i=1;i<=k;i++) { scanf("%d",&w[i]); }
put(s);
if(!ans) printf("No Answer!");
return 0;
}
最后状态:AC
总结:一开始没有优化(w[i]>l),TLE,优化后不知为何2个点过不去,原因在于数组只开到100,也就是说从0开始计数最后一个下标是99