雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

发放激活码——背包

Posted on 2014-02-20 23:01  huhuuu  阅读(273)  评论(0)    收藏  举报

http://wenda60.com/?programs.exam/a0bb3b20flzEY8AwZTTUBHBlYBUlRVAFMBVUpFSw

题目描述

完美世界最新的客户端游戏大作笑傲江湖最近已经开始测试了,由于希望参与的玩家太多,只能使用激活码的方式让一部分玩家可以参与测试,现在需要一个测试码的生成规则。

如从一组不重复的数字中获得随机几个数字组成验证码,其中只要是这些数字相加的和为相同的那么就认为是同一组验证码,最后希望获得一共有多少组有效验证码。

现在希望获得从一组N不同的数字中,获得和为的组个的个数。组合的个数有可能是1个 有可能是N个 。

输入格式

第一行输入1个整数M,表示总得数据组数。

第二行输入1个整数 2 < N < 100,表示需要输入的不同的数字的个数

第三行输入1个整数 ,表示数字的和

第四行输入N个不同数字(数字>0)中间用逗号隔开,   0 < 单个数字 <= 100

 

测试格式

按照和为result 的验证码的总数量。

 

 

输入样例

2

4

3

11 ,2, 3, 1

3

3

1,2,3

 

输出样例

2

2

 

比如4个数字

1,2,3,4 组合成7是几个

1,2,4 

3,4 

考虑0 1 2 3 4 5 6 7

0    1 0 0 0 0 0 0 0

1    1 1 0 0 0 0 0 0

2    1 1 1 1 0 0 0 0

3    1 1 1 2 1 1 1 0 

4    1 1 1 2 2 2 2 2

背包dp

#include<stdio.h>

int dp[10099];
int shu[109];

int main(){
    int i,j;
    int t,n,sum;
    while(scanf("%d",&t)!=EOF){
        while(t--){
            scanf("%d%d",&n,&sum);
            scanf("%d",&shu[1]);
            
            for(i=2;i<=n;i++){
                scanf(",%d",&shu[i]);
            }

            dp[0]=1;
            for(i=1;i<=sum;i++)dp[i]=0;

            for(i=1;i<=n;i++){
                for(j=sum;j>=0;j--){
                    if(dp[j]>=1)dp[shu[i]+j]+=dp[j];
                }
            }

            printf("%d\n",dp[sum]);
        }
    }

    return 0;
}
View Code