普通的多维背包做不了,需要优化一下
但是没有学优化。。别的方法也是可以做的
省去一个 表示阶段的 i 维度,dp[j]表示面值为j的钱是否被凑出来了,used[j]表示第i种硬币在凑面值为j的时候被用的次数
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define maxn 100005 int n,m,used[maxn],dp[maxn],a[200],c[200]; int main(){ while(scanf("%d%d",&n,&m),m){ for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++)scanf("%d",&c[i]); memset(dp,0,sizeof dp); dp[0]=1; for(int i=1;i<=n;i++){ memset(used,0,sizeof used); for(int j=a[i];j<=m;j++) if(!dp[j] && dp[j-a[i]] && used[j-a[i]]<c[i]) dp[j]=1,used[j]=used[j-a[i]]+1; } int ans=0; for(int i=1;i<=m;i++) if(dp[i]) ans++; printf("%d ",ans); } return 0; }