题意:现在有一个天平,还有C个挂钩和G个砝码,求解又多少种方法能使得天平平衡(注意必须使用所有的砝码)
dp[i][j]表示在挂上前i个物体的时,平衡度为j(j>0时表示左边重,j=0时表示天平平衡,j<0时表示右边重)时挂法的数量,而根据题意可以确定j的取值范围为:[-7500,7500],于是可以得到状态转移方程为:
dp[i][j]+=(dp[i-1][j-p[k]*g[i]]), p[k]表示第k个挂钩的位置,g[i]为第i个砝码的重量
由于j-p[k]*g[i]可能为负数,因此统一加上7500,那么初始状态dp[0][7500]=1(此时表示天平平衡),表示不用物体且使得天平平衡时的方法只有一种.
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n,m;
int a[21],b[21];
int dp[21][15001];
void read(){
// ifstream cin("in.txt");
int i,j,k;
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=m;i++)
cin>>b[i];
dp[0][7500]=1;
for(i=1;i<=m;i++)
for(j=-7500;j<=7500;j++)
for(k=1;k<=n;k++)
if(j-a[k]*b[i]>=-7500&&j-a[k]*b[i]<=7500)
dp[i][j+7500]+=dp[i-1][j-a[k]*b[i]+7500];
cout<<dp[m][7500]<<endl;
}
int main(){
read();
return 0;
}