基本思路:
注意点:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int MAXN=2e3,MAXVALUE=5e4; int coins[MAXN]; int vis[MAXVALUE];//该种价值是否能被组成 0:不能 1:能被组成 2:仅能被原始货币组成 void init(){ memset(vis,0,sizeof(vis)); memset(coins,0,sizeof(coins)); } int main(){ int T; scanf("%d",&T); while(T--){ init(); int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&coins[i]);//读入每种货币 vis[coins[i]]=2;//设置原始vis } sort(coins+1,coins+n+1);//按价值从小到大排序 for(int i=1;i<=coins[n];i++){//枚举每一种基础价格 if(vis[i]){//如果该价格能被组成 for(int j=1;j<=n;j++){//枚举每一种基础货币 if(i+coins[j]>coins[n])break; vis[i+coins[j]]=1;//设为能被组成 } } } int ans=0; for(int i=1;i<=coins[n];i++) if(vis[i]==2)ans++; printf("%d\n",ans); } return 0; }
原文:https://www.cnblogs.com/zbsy-wwx/p/11708007.html