(1)题意:
将砝码放到天平上,问有几种方式使天平平衡。
给出可以放置的位置和砝码的质量。
(2)思路:
题中有两个限制条件,可放置的位置,砝码的质量,判断有几种可能性,就是有几种方法能让天平平衡。
两种限制,用二维数组记录状态,dp[i(放置第i个砝码)][j(放置的后得到的权值(权值=到0的距离*质量))]
表示第i,j情况下有几种可能。
i的范围是1~25,j的范围是[-7500,+7500](20*15*25=7500)。
开一个数组记录每个背包放置不同物体的状态即可。
(3)代码:
(参考文章)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 15000;
int dp[30][maxn],xi[50],wi[50],c,g;
int main(void){
scanf("%d%d",&c,&g);
for(int i=1;i<=c;i++) scanf("%d",&xi[i]);
for(int i=1;i<=g;i++) scanf("%d",&wi[i]);
memset(dp,0,sizeof(dp));
dp[0][7500] = 1;
for(int i=1;i<=g;i++){
for(int j=1;j<=c;j++){
for(int k=maxn;k>=1;k--)
if(k+wi[i]*xi[j]>=0&&k+wi[i]*xi[j]<=maxn&&dp[i-1][k+wi[i]*xi[j]]!=0){
dp[i][k]+=dp[i-1][k+wi[i]*xi[j]];
}
}
}
printf("%d\n",dp[g][7500]);
return 0;
}