第七届河南省ACM大学生程序设计大赛 A.物资调度

来源:互联网 发布:c界面编程怎么写 编辑:程序博客网 时间:2024/04/17 02:31

这道题也是这场比赛中唯一一道我独立完成的题目

我是用DP写的,后来问问别人,用DFS写的也过了

问过卢凯鹏之后,他说本来有一个超大的数据,没人能过,所以数据改小了,数据变弱了

难怪我用四重循环可以过,别人用DFS也可以过

刚刚搜了下第七届河南省ACM大赛,没搜到题目,所以先把题解挂上吧


代码如下:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 10010#define ll long longusing namespace std;int a[MAXN];int dp[MAXN][MAXN];//dp[i][j]代表把第i个物品放入背包后,总容量为j的情况的个数int main(void) {    int T, n, m;    scanf("%d", &T);    while(T--) {        scanf("%d%d", &n, &m);        for(int i=1; i<=n; ++i)            scanf("%d", &a[i]);        //dp[i][j] = dp[k][t]+a[j-t];        memset(dp, 0, sizeof(dp));        for(int i=0; i<=n; ++i)            dp[i][a[i]] = 1;        for(int i=1; i<=n; ++i) {            for(int j=1; j<=m; ++j) {                for(int k=1; k<i; ++k) {                    for(int t=1; t<j; ++t) {                        if(dp[k][t] && t+a[i]==j) {                            dp[i][j] += dp[k][t];                        }                    }                }            }        }        int ans = 0;        for(int i=0; i<=n; ++i)            ans += dp[i][m];        printf("%d\n", ans);    }    return 0;}


0 0