您的位置:首页 > 其它

usaco Milk Measuring

2015-10-06 16:17 309 查看
迭代加深搜索。

一开始写了个完全背包,但只能过几个测试点,发现它有些情况不能很好的判断。

好在迭代加深并不难写。

/*
ID: modengd1
PROG: milk4
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
#include <vector>
using namespace std;

int input[100];
int Q,P;
int ans[100];
int dp[20001];
bool DFS(int deep,int index,int limit)//deep是当前层深也是就是该取第几个数了,index是前一个数在input数组中的下标。limit是本次搜索要找的集合的大小
{
if(deep==limit)
{
memset(dp,false,sizeof(dp));
dp[0]=true;
for(int i=0;i<limit;i++)
{
for(int j=ans[i];j<=Q;j++)
{
dp[j]|=dp[j-ans[i]];
}
}
if(dp[Q])
{
cout<<limit;
for(int i=0;i<limit;i++)
cout<<' '<<ans[i];
cout<<endl;
return true;
}
else
return false;
}
for(int i=index+1;i<=P-(limit-deep-1);i++)
{
ans[deep]=input[i];
if(DFS(deep+1,i,limit))
return true;
}
return false;
}
int main()
{
freopen("milk4.in","r",stdin);
freopen("milk4.out","w",stdout);
scanf("%d",&Q);
scanf("%d",&P);
for(int i=0;i<P;i++)
{
scanf("%d",&input[i]);
}
sort(input,input+P);
for(int i=1;i<=P;i++)
{
if(DFS(0,-1,i))
break;
}
return 0 ;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: