n个位置放m个砝码 求天平的平衡有几种方案
分组背包 每个物品是一个组 总个m个物品m组 每个组有n个 因为每个物品可以在n个位置中任何一个
此外这题又是与负数 还是平移
可以滚动 因为不卡内存 所以没写滚动 写滚动还要考虑正负
#include <algorithm>
#include <cstring>
#include <cstdio>
const int maxn = 30;
int a[maxn], b[maxn];
int dp[maxn][20000];
int main()
{
int n, m;
while(scanf("%d %d", &n, &m) != EOF)
{
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= m; i++)
scanf("%d", &b[i]);
memset(dp, 0, sizeof(dp));
dp[0][7500] = 1;
for(int i = 1; i <= m; i++)//先枚举每一组
{
for(int j = 0; j <= 15000; j++)//枚举容量循环不能颠倒
{
for(int k = 1; k <= n; k++)//枚举每一组的物品
{
if(j-b[i]*a[k] >= 0)
dp[i][j] += dp[i-1][j-b[i]*a[k]];
}
}
}
printf("%d\n", dp[m][7500]);
}
return 0;
}