2 条题解

  • 0
    @ 2025-10-8 17:04:12
    #include<bits/stdc++.h>
    using namespace std;
    int a[210],c[210],w[210*16],t[210*16],f[21100];
    int main()
    {
        int n;scanf("%d",&n); 
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)scanf("%d",&c[i]);
        int k;scanf("%d",&k);
        
        int len=0;
    	for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=c[i];j*=2)w[++len]=j*a[i],t[len]=j,c[i]-=j;
            if(c[i]>0)w[++len]=c[i]*a[i],t[len]=c[i];
        }
            
    	memset(f,63,sizeof(f));f[0]=0;
        for(int i=1;i<=len;i++)
        {
            for(int j=k;j>=w[i];j--)f[j]=min(f[j],f[j-w[i]]+t[i]);
        }
    
        printf("%d\n",f[k]);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:04:02
      #include<bits/stdc++.h>
      using namespace std;
      int a[210],c[210],w[210*16],t[210*16],f[21100];
      int main()
      {
      	int n;scanf("%d",&n); 
          for(int i=1;i<=n;i++)scanf("%d",&a[i]);
          for(int i=1;i<=n;i++)scanf("%d",&c[i]);
          int k;scanf("%d",&k);
          
          int len=0;
      	for(int i=1;i<=n;i++)
          {
              for(int j=1;j<=c[i];j*=2)w[++len]=j*a[i],t[len]=j,c[i]-=j;
              if(c[i]>0)w[++len]=c[i]*a[i],t[len]=c[i];
          }
              
      	memset(f,63,sizeof(f));f[0]=0;
          for(int i=1;i<=len;i++)
          {
              for(int j=k;j>=w[i];j--)f[j]=min(f[j],f[j-w[i]]+t[i]);
          }
      
          printf("%d\n",f[k]);
          return 0;
      }
      • 1

      *【背包:二进制压缩】硬币2[POI 2005] BAN-Bank Notes

      信息

      ID
      3186
      时间
      1000ms
      内存
      64MiB
      难度
      7
      标签
      递交数
      61
      已通过
      16
      上传者