题目描述:你有n个硬币,第i个硬币面值为ai,现在总队长想知道如果丢掉了某个硬币,剩下的硬币能组成多少种价值?(0 价值不算)
样例输入:
3
1 1 3
样例输出:
3
3
2
数据范围:
对于30%的数据 1<=n<=50,1<=ai<=100;
对于100%的数据 1<=n<=100,1<=ai<=3000。
算法:背包
代码:
#include <bits/stdc++.h>
#define N 300001
using
namespace
std;
int
n,a[105],f[N],g[N];
int
main()
{
scanf
(
"%d"
,&n);
for
(
int
i=1;i<=n;i++)
scanf
(
"%d"
,&a[i]);
f[0]=1;
for
(
int
i=1;i<=n;i++)
for
(
int
j=N;j>=0;j--)
if
(j+a[i]<=N) f[j+a[i]]+=f[j];
for
(
int
i=1;i<=n;i++)
{
for
(
int
j=0;j<=N;j++) g[j]=f[j];
int
ans=0;
for
(
int
j=0;j<=N;j++)
if
(j+a[i]<=N) g[j+a[i]]-=g[j];
for
(
int
j=1;j<=N;j++)
if
(g[j]) ans++;
printf
(
"%d
"
,ans);
}
}