题目描述
如从一组不重复的数字中获得随机几个数字组成验证码,其中只要是这些数字相加的和为相同的那么就认为是同一组验证码,最后希望获得一共有多少组有效验证码。
现在希望获得从一组N不同的数字中,获得和为C 的组个的个数。组合的个数有可能是1个 有可能是N个 。
输入格式
第一行输入1个整数M,表示总得数据组数。
第二行输入1个整数 2 < N < 100,表示需要输入的不同的数字的个数
第三行输入1个整数 C ,表示数字的和
第四行输入N个不同数字(数字>0)中间用逗号隔开, 0 < 单个数字 <= 100
测试格式
按照和为result 的验证码的总数量。
输入样例:
2
4
3
11 ,2, 3, 1
3
3
1,2,3
输出样例
2
如从一组不重复的数字中获得随机几个数字组成验证码,其中只要是这些数字相加的和为相同的那么就认为是同一组验证码,最后希望获得一共有多少组有效验证码。
现在希望获得从一组N不同的数字中,获得和为C 的组个的个数。组合的个数有可能是1个 有可能是N个 。
输入格式
第一行输入1个整数M,表示总得数据组数。
第二行输入1个整数 2 < N < 100,表示需要输入的不同的数字的个数
第三行输入1个整数 C ,表示数字的和
第四行输入N个不同数字(数字>0)中间用逗号隔开, 0 < 单个数字 <= 100
测试格式
按照和为result 的验证码的总数量。
输入样例:
2
4
3
11 ,2, 3, 1
3
3
1,2,3
输出样例
2
2
才用动态规划,可转换为01背包的思想,状态方程:dp[j]=dp[j]+dp[j-num[i]];其中num[i]表示第i个数值,dp[j]定义为:和为j的方案数。
#include <map>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <memory.h>
#include <algorithm>
using namespace std;
int num[110];
int dp[110];
int main()
{
int m;
cin>>m;
while(m--)
{
int n;
cin>>n;
int c;
cin>>c;
for(int i=1;i<=n;i++)
{
cin>>num[i];
if(i!=n)cin.get();
}
sort(num+1,num+n+1);
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=c;j>=num[i];j--)
{
dp[j]=dp[j]+dp[j-num[i]];
}
}
cout<<dp[c]<<endl;
}
}