顶呱呱的题解:点击打开链接
#include<iostream> #include<cstring> #include<cstdio> #define maxn 30 #define flow 7500 using namespace std; int f[maxn][maxn]; int n,m; int c[maxn],g[maxn]; int dp[maxn][15020]; void solve() { dp[0][flow]=1; for(int i=1;i<=m;i++) { for(int k=0;k<=flow*2;k++) //先枚容量 if(dp[i-1][k]) { for(int j=1;j<=n;j++) //再枚举背包 { dp[i][k+c[j]*g[i]]+=dp[i-1][k]; } } } printf("%d\n",dp[m][flow]); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int j=1;j<=m;j++) scanf("%d",&g[j]); solve(); return 0; }