硬币

题目描述:你有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);
    }
}
原文地址:https://www.cnblogs.com/Yun-17/p/9588297.html