AcWing 532. 货币系统
原题链接
中等
作者:
总有刁民想害朕
,
2020-03-07 00:34:20
,
所有人可见
,
阅读 648
思路分析
1:通过本题明白给定一个数组如何找出数组中除了他自己以外不可以被其他元素(其他元素可以选取的个数是无限的)通过相加的方式得到的数就可以,我们可以想到和完全背包问题相类似,所以我们可以借鉴一下完全背包的思路
2:dp[i] 表示 元素i可以被数组中的元素表示出来的的方案数,如果等于1那么可知改元素符合条件 ,计算求方案数才用和上面的题一样的方法
3:不可以被其他元素表示出来得到的数,一定可以通过某些相加的方式把其他元素表示出来
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 25010;
int dp[N];
int arr[N];
int main(){
int T;cin >> T;
while(T --){
int n;cin >> n;
for(int i = 1;i <= n;++i) cin >> arr[i];
sort(arr, arr+1+n);
int m = arr[n];
memset(dp, 0, sizeof dp);
dp[0] = 1;// 组成0的方案数是1
for(int i = 1;i <= n;++i){
for(int j = arr[i];j <= m;++j)
dp[j] = dp[j] + dp[j-arr[i]];
}
int ans = 0;
for(int i = 1;i <= n;++i)
if(dp[arr[i]] == 1) ++ans;
cout << ans << endl;
}
return 0;
}