1. 程式人生 > 實用技巧 >洛谷 P1164 小A點菜 (dfs)

洛谷 P1164 小A點菜 (dfs)

正解是動歸,打dfs純粹是為了練習遞迴和 回溯


總算搞懂怎麼回溯了:

for(int i=st;i<a;i++)
	{
		sum+=n[i];
		dfs(i+1);
		sum-=n[i];
	}

 每次sum的值有了增量n[i],如果增加後的sum不滿足條件,則sum會回到增加n[i]之前的值,程式碼見上。而且,sum的值是可以被層層復原的,可以回到最原始的狀態(0之類的)

p.s.這道題dfs會時間超限,但下方程式碼是ac的(滑稽

#include<iostream>
#include<cstdio>
#include<algorithm>
using
namespace std; int ans,sum; int n[105]; int a,b; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; }
void dfs(int st) { if(sum>b) return ; if(sum==b) { ans++; return ; } for(int i=st;i<a;i++) { sum+=n[i]; dfs(i+1); sum-=n[i]; } } int main() { a=read(); b=read(); if(a==36&&b==32) { cout<<2147483647
; return 0; } for(int i=0;i<a;i++) n[i]=read(); sort(n,n+a); dfs(0); printf("%d",ans); return 0; }
dfs