繼續我的刷題之路;~::~
輸入描述 input description
輸入的第一行包含2個整數n(1≤n≤8),m(1≤m≤10)。表示有n種不同型別的本子和m種小寒喜歡的顏色。接下來乙個n*m的矩陣。第i行第j列的整數aij表示在第i種型別的本子中包含小寒喜歡的顏色j的紙有aij(1≤aij≤100)張。再接下來的一排n個整數b1到bn,表示每種顏色的本子在超市中有多少本(1≤bi≤5)。
輸出描述 output description
輸出包含乙個整數,表示小松最少需要折的蝴蝶數目,如果該數目超過1000,則輸出」alternative!」。(由於可能存在多種買本子的方案,所以這裡就不要求輸出具體方案了)
樣例輸入 sample input
2 32 1 2
4 8 4
5 5樣例輸出 sample output
36資料範圍及提示 data size & hint
由題意可知,這就是個搜尋題,
搜出來最優的買本子的情況就好了
而且n和m都小於10
爆搜即可;
並且可以只用乙個一維陣列存當前狀態;
每次列舉乙個本子,計算加上這個本子之後是否會達到條件或超出1000
然後return
寫判重陣列 v 用hash 來判重;
dfs取最優解即可;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 1000000000
#define fi first
#define se second
#define n 100005
#define p 1000000007
#define debug(x) cerr<<#x<<"="<#define mp(x,y) make_pair(x,y)
using namespace std;
int b[10],n,m,a[10][11],q[11],ans=2147483647;
bool v[23330334];
inline int get_num()
//忽略上面這一大堆沒用的東西////
bool win()//判斷是否達成條件
return1;}
int sum()//計算總蝴蝶數;
int hash()//將b陣列排成乙個數子,hash
return num%10000007;
}void dfs()
if(sum()>1000)
for(int i=1;i<=n;i++)
b[i]++;}}
}int main()
for(int i=1;i<=n;i++)
}for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++)
}if(ans>1000)
cout《噫~
嗚啦啦啦啦
~2333333333333
~~k~l:k~
codevs1005 生日禮物
時間限制 1 s 空間限制 128000 kb 題目等級 gold 輸入描述 input description 輸入的第一行包含2個整數n 1 n 8 m 1 m 10 表示有n種不同型別的本子和m種小寒喜歡的顏色。接下來乙個n m的矩陣。第i行第j列的整數aij表示在第i種型別的本子中包含小寒喜...
Codevs 1005 生日禮物
時間限制 1 s 空間限制 128000 kb 題目等級 gold 輸入描述 input description 輸入的第一行包含2個整數n 1 n 8 m 1 m 10 表示有n種不同型別的本子和m種小寒喜歡的顏色。接下來乙個n m的矩陣。第i行第j列的整數aij表示在第i種型別的本子中包含小寒喜...
codevs1005 生日禮物
這個題直接爆搜顯然很好想,但是直接爆搜而不剪枝的話最壞複雜度應該是6 10 10,顯然會 開始我並沒有想到怎麼剪枝,因此只拿了80,看過題解後恍然大悟 我們可以提前處理好第i種本子之後所有的本子每種紙最多還能用多少,搜尋的時候,如果發現某種顏色的紙,就算之後所有的該種顏色的紙全部用上都無法超越現在的...