母函数
#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;
}