P1077 摆花
P1077 摆花
题解
实际上,这是一个背包问题
分组背包 + 背包方案数
这道题的费用在哪里鸭??
隐含在题目里:摆花总盆数不超过 m
也就是花拥有了 ‘ 盆数 ’ 费用
为什么是分组背包??
因为一种花最多可以摆 ai 盆,相同花色的花摆在一起,花没有编号,摆哪一盆都是一样的
所以对于同一种花,摆0盆就是一个亚子,摆1盆就是另一种亚子,摆2盆还是一种亚子... 但是这些亚子都是相互冲突的啊,摆了一盆就不能摆两盆了(显然)
背包方案数??
自然是方案数的累加了
注意:
f [m] 为摆 m 盆花的最大方案数
边界:f [0] =1
转移方程:f [ j ]=( f[ j ] +f[ j - .. ] )
代码
#include<bits/stdc++.h> using namespace std; const int mod=1e6+7; int n,m,ans=0; int a[105],w[105][105]; long long f[105]; //开小的话会炸 int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } memset(f,0,sizeof(f)); f[0]=1; //处理边界:摆0盆花有一种方案 for(int i=1;i<=n;i++) for(int j=m;j>=0;j--) for(int k=1;k<=a[i];k++) //分组,第i组中的每一种情况,k要从1开始枚举啊 //要是从0开始的话,那么一开始f[j]就翻倍了 { f[j]=(f[j]%mod+f[j-k]%mod)%mod; } cout<<f[m]%mod; return 0; }
困惑
细心的小可爱会发现代码里面那个 w 二维数组定义了以后就再也没有提及它了
提交代码的时候不加会WA,加了就AC没事了,可能是RP问题吧QAQ
之前也遇到过这种情况QAQ
解释一下w是干啥的:(不想看的可以走了)
一开始构建代码的时候,想着既然是分组背包,就开个数组记录一下每一组的情况吧
w[i][j]表示第 i 种花摆 j 盆的 ‘ 件数 ’ 费用,后来发现可以不用,直接用 k 代替就好了(没错,就是第三重for循环的那个k)
但是现在它没用了QAQ