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

母函数

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值