洛谷 P2347 [NOIP 1996 提高组] 砝码称重 题解
题目链接
思路分析
这题其实就是有 \(6\) 件物品的多重背包,把其朴素版本复制 \(6\) 份即可。
代码呈现
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int a1,a2,a3,a4,a5,a6;
bool dp[N];
int main(){
scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6);
int s=a1+2*a2+3*a3+5*a4+10*a5+20*a6;
dp[0]=1;
for (int i=1;i<=a1;++i){
for (int j=s;j>=i;--j) dp[j]|=dp[j-i];
}
for (int i=1;i<=a2;++i){
for (int j=s;j>=2*i;--j) dp[j]|=dp[j-2*i];
}
for (int i=1;i<=a3;++i){
for (int j=s;j>=3*i;--j) dp[j]|=dp[j-3*i];
}
for (int i=1;i<=a4;++i){
for (int j=s;j>=5*i;--j) dp[j]|=dp[j-5*i];
}
for (int i=1;i<=a5;++i){
for (int j=s;j>=10*i;--j) dp[j]|=dp[j-10*i];
}
for (int i=1;i<=a6;++i){
for (int j=s;j>=20*i;--j) dp[j]|=dp[j-20*i];
}
int cnt=0;
for (int i=1;i<=s;++i){
if (dp[i]) ++cnt;
}
printf("Total=%d",cnt);
return 0;
}

浙公网安备 33010602011771号