迭代加深搜索。
一开始写了个完全背包,但只能过几个测试点,发现它有些情况不能很好的判断。
好在迭代加深并不难写。
/* 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 ; }
原文:http://www.cnblogs.com/modengdubai/p/4857288.html