描述
有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
dp[0]一定要设置成1。
代码
#include<bits/stdc++.h>
using namespace std;
int num[30],dp[1005];
int main(){
int n,t;
cin>>n>>t;
for(int i=0;i<n;i++){
cin>>num[i];
}
dp[0]=1;
for(int i=0;i<n;i++){
for(int j=t;j>=num[i];j--){
dp[j]+=dp[j-num[i]];
}
}
cout << dp[t] <<endl;
return 0;
}
1761:神奇的口袋(2)
总时间限制:
1000ms
内存限制:
65536kB
描述
有一个神奇的口袋,总的容积是400,用这个口袋可以变出一些物品,这些物品的总体积必须是400。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是400,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
输入
输入的第一行是正整数n (1 <= n <= 200),表示不同的物品的数目。接下来的n行,每行有一个1到400之间的正整数,分别给出a1,a2……an的值。
输出
输出不同的选择物品的方式的数目对10000取模的结果(因为结果可能很大,为了避免高精度计算,只要求对10000取模的结果)。
样例输入
3
200
200
200
样例输出
3
代码
#include<iostream>
using namespace std;
int a[205],dp[405];
int n,sum=0;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
dp[0]=1;
for(int i=0;i<n;i++){
for(int j=400;j>=a[i];j--){
dp[j]+=dp[j-a[i]];
dp[j]%=10000;
}
}
cout << dp[400] <<endl;
return 0;
}