hdu1258---Sum It Up解題報告(DFS入門)
阿新 • • 發佈:2018-11-05
Sum It Up題目連結
題目大意:輸入一個val,和一個n ,然後n個數,求n個數中相加=val的所有情況
(val不一定要n個數組成),但一定要是降序相加(即第一個相加數是最大的)
AC Code:
#include<iostream> #include<sstream> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<cstdio> #include<map> #include<vector> #include<stack> #include<queue> #include<set> #include<list> #define mod 998244353 #define INF 0x3f3f3f3f #define Min 0xc0c0c0c0 #define mst(a) memset(a,0,sizeof(a)) #define f(i,a,b) for(int i = a; i < b; i++) using namespace std; typedef long long ll; const int MAX_N = 1e6 + 5; int n, val; int arr[15], num[15]; bool vis[15]; bool flag; void dfs(int sum, int s){ if(sum == val){ for(int j = 1; j < s - 1; j++){ cout<<num[j]<<"+"; } cout<<num[s - 1]<<endl; flag = true; return ; } for(int i = 1; i <= n; i++){ if(sum + arr[i] <= val && num[s - 1] >= arr[i] && !vis[i]){ num[s] = arr[i]; vis[i] = 1; dfs(sum + arr[i], s + 1); vis[i] = 0; while(arr[i] == arr[i + 1] && i <= n) i++; } } } int main(){ //freopen("c1.txt", "w", stdin); //freopen("c2.txt", "r", stdout); ios::sync_with_stdio(false); while(cin>>val>>n){ if(val == 0 && n == 0){ break; } mst(num), mst(vis); for(int i = 1; i <= n; i++){ cin>>arr[i]; //cin>>arr[i]; } flag = false; num[0] = INF; cout<<"Sums of "<<val<<":"<<endl; dfs(0, 1); if(!flag){ cout<<"NONE"<<endl; } } //fclose(stdin); //fclose(stdout); return 0; }