HDU ACM 11 2079 选课时间 母函数或者DP

来源:互联网 发布:上海优越感知乎 编辑:程序博客网 时间:2024/05/22 03:17

母函数

#include <iostream>#include <algorithm>int Lu[1000], Hui[1000];using namespace std;int main(){int T;cin >> T;int n, m;int Yi[1000], Zheng[10000];while (T--){cin >> n >> m;for (int i = 1; i <= m; i++)cin >> Yi[i] >> Zheng[i];memset(Lu, 0, sizeof(Lu));for (int i = 0, t = 0; i <= n && t <= Zheng[1]; i += Yi[1], t++)Lu[i] = 1;for (int i = 0; i <= n; i++)Hui[i] = 0;for (int i = 2; i <= m; i++){for (int j = 0; j <= n; j++)for (int k = 0, t = 0; j + k <= n && t <= Zheng[i]; k += Yi[i], t++)Hui[j + k] = Lu[j] + Hui[j + k];for (int j = 0; j <= n; j++){Lu[j] = Hui[j];Hui[j] = 0;}}cout << Lu[n] << endl;}return 0;}

DP。DP我不会。再练一段时间回来看吧

#include<stdio.h>//可以说是01背包+多重背包#include<string.h>int main(){    int T,n,m,i,j,k;    int a[10],num[10],dp[45];    scanf("%d",&T);    while(T--)    {       scanf("%d%d",&n,&m);       for(i=1;i<=m;i++)           scanf("%d%d",&a[i],&num[i]);       for(i=1;i<=n;i++)           dp[i]=0;       dp[0]=1;       for(i=1;i<=m;i++)           for(j=n;j>=a[i];j--)               for(k=1;k<=num[i]&&(j-a[i]*k)>=0;k++)//这个for循环用于避免重复,设置很巧妙,想了很久啊                   dp[j]=dp[j]+dp[j-a[i]*k];//就是把一个物品的每种情况都装进容量固定的包里,这里就会避免重复       printf("%d\n",dp[n]);    }    return 0;}


0 0
原创粉丝点击