这是一道01背包的题目
题意:有一个天平,左臂右臂各长15,然后给出n,m,n代表有几个挂钩,挂钩给出负数代表在左臂的距离,正数则在右臂 m代表有m个砝码,要你求出使得这个天平保持平衡有几种方法,要求所有砝码全部使用完
dp[i][j] i用来判断第i个砝码是否要放, j代表平衡位子
由于下标不能为0 15*20*20=7500
所以平衡位子为7500
c[i] 代表位子 w[i]代表重量
dp[i][j]+=dp[i-1][j+w[i]*c[k]]
动态规划出平衡位子时有多少种情况
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#define N 1005
using namespace std;
int C,G;
int dp[30][16000];
int c[25],w[25];
int main()
{
cin>>C>>G;
for(int i=1;i<=C;i++)
cin>>c[i];
for(int i=1;i<=G;i++)
cin>>w[i];
dp[0][7500]=1;
for(int i=1;i<=G;i++)
{
for(int j=15000;j>=0;j--)
{
for(int k=1;k<=C;k++)
{
dp[i][j+c[k]*w[i]]+=dp[i-1][j];
}
}
}
cout<<dp[G][7500]<<endl;
}