poj1742(背包问题)

来源:互联网 发布:淘宝如何搜索优选好店 编辑:程序博客网 时间:2024/04/29 19:56

#include<stdio.h>
int dp[100010];
int A[105];//钱币价值
int C[105];//对应钱币的数量
int main(void)
{
         int n,m,i,j,ans=0;
         while((~scanf("%d%d",&n,&m))&&(n+m)!=0)
         {
                ans=0;
                memset(dp,-1,sizeof(dp));
                dp[0]=0;
                for(i=0;i<n;i++)
                    scanf("%d",&A[i]);
                for(i=0;i<n;i++)
                    scanf("%d",&C[i]);
               for(i=0;i<n;i++)//   i代表使用前i种纸币
               {
                    for(j=0;j<=m;j++)  //j代表使用纸币后,可以达到的钱数
                    {
                        if(dp[j]>=0)                                //if(dp[i+1][j]>=0)
                              dp[j]=C[i];                            //   dp[i+1][j]=C[i];

                        else                                           // else
                            if(j<A[i]||dp[j-A[i]]<=0)            //      if(j<A[i]||dp[i+1][j-A[i]]<=0)
                              dp[j]=-1;                              //  dp[i+1][j]=-1;
                        else                                           //else
                             dp[j]=dp[j-A[i]]-1;                  //   dp[i+1][j]=dp[i+1][j-A[i]]-1;
                  }                                                         //2维数组简化为一维
              }
             for(i=0;i<=m;i++)
             {
                      if(dp[i]>=0)
                         ans++;
             }
             printf("%d\n",ans-1);
         }
}

0 0