寫了一個多小時的DFS感覺對了各種WA,進discuss找數據發現神奇取模方法,不過這個取模方法明顯有問題,再找了別人的DFS秒殺代碼,感覺他們的代碼也明顯有問題,我自己試了好多數據都是對的可是就是WA,還是用DP寫的好,不會WA。
但是也不是簡單的DP,求可達的範圍那個DP其實和DFS是一樣的,大不了沒有用遞歸來實現,好像多重揹包纔是正解。
附上我的喫屎代碼,迷之WA
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int data[20010],a[20010],n,k,sum,Case=0,anssum;
bool dfs(int remain,int cur);
void nosolve()
{
cout << "Collection #" << Case << ':' << endl;
cout << "Can't be divided." << endl << endl;
}
void solved()
{
cout << "Collection #" << Case << ':' << endl;
cout << "Can be divided." << endl << endl;
}
void findsolve()
{
int anssum;
bool flag;
anssum=sum/2;
n=0;
for (int i=6;i>=1;i--)
if (flag==false)
if (dfs(anssum,i))
{
solved();
flag=true;
}
if (flag==false) nosolve();
}
bool dfs(int remain,int cur)
{
int num;
for (num=a[cur];num>=1;num--)
if (remain-cur*num>=0)
{
//cout<<remain<<" "<<cur<<endl;
if (remain-cur*num<0) continue;
if (remain-cur*num==0) { return true;}
for (int i=cur-1;i>=1;i--)
if (dfs(remain-cur*num,i)) return true;
}
return false;
}
int main()
{
while (cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]&&(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]))
{
Case++;
sum=0;
for (int i=1;i<=6;i++) sum=sum+a[i]*i;
if (sum%2==1) nosolve();
else findsolve();
}
return 0;
}