codevs 1005 生日禮物 題解報告

2021-07-23 18:20:21 字數 1708 閱讀 7295

繼續我的刷題之路;~::~

輸入描述 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種本子之後所有的本子每種紙最多還能用多少,搜尋的時候,如果發現某種顏色的紙,就算之後所有的該種顏色的紙全部用上都無法超越現在的...