硬币方案
题目
解析
显然的背包,考虑用记录到一个方案的最少当前硬币数量,不难转移,于是就AC了
code:
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[110],t,tot[100010],ans;
bool dp[100010];
int main()
{
while(scanf("%d%d",&n,&m)&&n&&m)
{
memset(dp,0,sizeof(dp)),dp[ans=0]=1;
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
scanf("%d",&t),memset(tot,0,sizeof(tot));
for(int j=a[i];j<=m;++j)if((!dp[j])&&dp[j-a[i]]&&tot[j-a[i]]<t)tot[j]=tot[j-a[i]]+1,dp[j]=1;
//注意,必须转移时才转移
}
for(int i=1;i<=m;++i)ans+=dp[i];
printf("%d\n",ans);
}
return 0;
}