第一思路暴力
直接在每一个木块上枚举可能的颜色,最后对所有方案计数即可
#include<iostream> using namespace std; const long long mod=1e9+7; int ans=0; int c[100];//各种颜色的数量 int draw[100];//各个木块上的颜色 int k,n; void dfs(int index){ if(index>n){ ans=(ans+1)%mod; // for(int i=1;i<=n;i++){ // cout<<draw[i]<<" "; // } // cout<<endl; }else{ for(int i=1;i<=k;i++){//选择颜色(使用1~k代表颜色) if(c[i]>0&&i!=draw[index-1]){//该颜色还有存货同时不等于上一种颜色 draw[index]=i; c[i]--; dfs(index+1); c[i]++; draw[index]=0; } } } } int main(){ cin>>k; for(int i=1;i<=k;i++){ cin>>c[i]; n+=c[i];//所有木块 } dfs(1); cout<<ans<<endl; return 0; }
记忆化搜索优化可参考这位大佬题解 P2476 【[SCOI2008]着色方案】 - ADay526 - 博客园 (cnblogs.com)