完美未来之星编程比赛 复赛第二场 发放激活码

来源:互联网 发布:core java中文版下载 编辑:程序博客网 时间:2024/04/30 09:03
题目描述
如从一组不重复的数字中获得随机几个数字组成验证码,其中只要是这些数字相加的和为相同的那么就认为是同一组验证码,最后希望获得一共有多少组有效验证码。
现在希望获得从一组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;}}


原创粉丝点击