多重背包
Problem Description
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),
要求:
输入方式:a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出方式:N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
Input
只有一行,有六个整数,每个数之间用一个空格隔开。
Output
输出N,N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。
SampleInput
1 1 0 0 0 0
SampleOutput
3 Hint:表示可以称出1g,2g,3g三种不同的重量。
#include <cstdio>
#include <cstring>
#define max(x,y) x>y? x:y;
int dp[1005];
int vis[1005];
int main(){
int A[6] = {1,2,3,5,10,20};
int N[6] ;
int sum=0;
for(int i=0;i<6;++i){
scanf("%d",&N[i]);
sum+=N[i]*A[i];
}
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
int count = 0;
//面值
for(int i=0;i<6;++i){
//面值个数
for(int j=0;j<N[i];++j){
for(int k=sum;k>=A[i];--k){
dp[k] = max(dp[k-A[i]]+A[i],dp[k]);
// printf("%d\n",dp[k]);
if(vis[dp[k]]==0){
count++;
vis[dp[k]]=1;
}
}
}
}
printf("%d\n",count);
return 0;
}