硬币 coin题解

来源:互联网 发布:node.js入门pdf 编辑:程序博客网 时间:2024/06/13 07:32

题目描述

你有n个硬币,第i个硬币面值为ai,现在总队长想知道如果丢掉了某个硬币,剩下的硬币能组成多少种价值?(0 价值不算)

输入

第一行一个整数n
第二行n 个整数:a1,a2…an。

输出

输出n行,第i行表示没有第i个硬币能组成多少种价值。

样例输入

3
1 1 3

样例输出

3
3
2

提示

【数据范围】

对于30%的数据 1<=n<=50,1<=ai<=100;对于100%的数据 1<=n<=100,1<=ai<=3000。

想法

  • 简单的背包DP

算法

  • 见代码

代码

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <string>#include <cmath>#define MAXN 300005using namespace std;int n,x[105],f[MAXN];int main(){    scanf("%d",&n);    for (int i=1;i<=n;i++)scanf("%d",&x[i]);    f[0]=1;    for (int i=1;i<=n;i++)        for (int j=MAXN;j>=0;j--)            if(f[j]&&j+x[i]<=MAXN)f[j+x[i]]+=f[j];    for (int i=1;i<=n;i++)    {        int ans=0;        for (int j=0;j<=MAXN;j++)            if(f[j]&&j+x[i]<=MAXN)f[j+x[i]]-=f[j];        for (int j=1;j<=MAXN;j++)            if(f[j])ans++;        printf("%d\n",ans);        for (int j=MAXN;j>=0;j--)            if(f[j]&&j+x[i]<=MAXN)f[j+x[i]]+=f[j];    }    return 0;}
0 0
原创粉丝点击