参考了别人的思路 点击打开链接
N种距离钩子,m个重量,每个重量放不同的钩子就是一个分组
分组背包:
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =25;
int n,m;
int w[maxnum],h[maxnum];
int dp[maxnum][15005];
int main()
{
scanf("%d%d",&n,&m);
FOR(i,1,n){
scanf("%d",&h[i]);
}
FOR(i,1,m){
scanf("%d",&w[i]);
}
dp[0][7500]=1;
FOR(i,1,m){
FOR(j,0,15000){
FOR(k,1,n){
int last = j-w[i]*h[k];
if(last>=0&&last<=15000&&dp[i-1][last])
dp[i][j]+=dp[i-1][last];
}
}
}
printf("%d\n",dp[m][7500]);
return 0;
}