1291:数字组合
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 8609 通过数: 5071
【题目描述】
有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如:
n=5,5个数分别为1,2,3,4,5,t=5;
那么可能的组合有5=1+4和5=2+3和5=5三种组合方式。
【输入】
输入的第一行是两个正整数n和t,用空格隔开,其中1≤n≤20,表示正整数的个数,t为要求的和(1≤t≤1000);
接下来的一行是n个正整数,用空格隔开。
【输出】
和为t的不同的组合方式的数目。
【输入样例】
5 5
1 2 3 4 5
【输出样例】
3
这样思考:每个数字可取可不取,转化为01背包问题。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x7fffffff
#define endl '\n'
int n,m;
int dp[500000],a[500000];
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=m;j>=a[i];j--){
dp[j]+=dp[j-a[i]];
}
}
cout<<dp[m]<<endl;
}
//考虑边界了?
//考虑特殊情况?
//考虑输出中间值勘误?