题目大意
现有一个天平,它有C个挂钩和G个砝码,问有多少种方法可以使得天平平衡(砝码必须用完)
题解
其实就是让背包容量为0的方法有多少种方法,但是这样的话背包容量会出现负数,所以可以平移一下,背包容量最大值为20*25*15=7500,即平移量为7500,最后答案就是dp[G][7500]
代码:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; #define MAXN 7500 int dp[25][MAXN*2+5]; int a[25],w[25]; int main() { int n,m; while(cin>>n>>m) { memset(dp,0,sizeof(dp)); for(int i=1; i<=n; i++) cin>>a[i]; for(int i=1; i<=m; i++) cin>>w[i]; dp[0][MAXN]=1; for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) { int value=w[i]*a[j]; for(int k=0; k<=MAXN*2; k++) if(dp[i-1][k]) dp[i][k+value]+=dp[i-1][k]; } cout<<dp[m][MAXN]<<endl; } return 0; }