题目:点击打开链接
题意:
放砝码,给出位置,和砝码质量,求组合使天平平衡的方案数。
看图,我的思路:
相当于砝码质量只留1kg,其他分到臂杆长度上去了。
然后发现不可行,最右边点不好数,学习他人的方法,把dp[0][7500]设为1,向左或向右出去再回来,dp[0][7500]就能++。
也并不算二维背包,就是两层循环找乘积,放到最内层循环在0到15000上记录上。
因为加的是砝码,所以质量在最外层。
#include<iostream>
#include<cstring>
#define ll long long int
using namespace std;
const int inf=0x3f3f3f3f;
int dp[25][15005],s[25],w[25];
int main(){
int n,m;
while(cin>>n>>m){
for(int i=1;i<=n;i++)
cin>>s[i];
for(int i=1;i<=m;i++)
cin>>w[i];
memset(dp,0,sizeof(dp));
dp[0][7500]=1;
for(int i=1;i<=m;i++)
for(int k=1;k<=n;k++)
for(int j=15000;j>0;j--)
if(j+s[k]*w[i]>=0)
dp[i][j]+=dp[i-1][j+s[k]*w[i]];
cout<<dp[m][7500]<<endl;
}
return 0;
}