Description
你有n个硬币,第i硬币面值为ai,现在总队长想知道如果丢掉了某个硬币,剩下的硬币能组成多少种价值?(0价值不算)
Input
第一行一个整数n
第二行n个整数。,a1,a2…an。
1<=n<=100,1<=ai<=3000
Output
输出n行
第i行表示没有第i个硬币能组成多少种价值。
Sample Input
3 1 1 3
Sample Output
3 3 2
分析
按照LCX巨佬讲的方法,我们可以先处理出在没有丢掉任何一枚硬币的情况下每种价值的组合方案数,也就是每种价值可以被凑出的次数,然后枚举丢掉的硬币,把它的贡献减掉就可以了。
简单来说就是先用一个背包的思想
dp[j + a[i]] += dp[j];
这样就预处理好了
然后枚举丢掉的硬币,减掉它的贡献即可。
输出完答案记得加回去
还是看代码吧。。/抓狂
代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[110], dp[300010];
inline int read()