程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 2844 Coins - 多重背包

hdu 2844 Coins - 多重背包

編輯:C++入門知識

print?/*
問一些硬幣能組合到的錢數有多少種?
多重背包 容量等於價值的算一種
*/ 
#include<stdio.h>  
#include<string.h>  
struct node 

    int w,v,c; 
}wu[150]; 
int n,m; 
int dp[101000]; 
 
void cpack(int c,int ww,int*d,int w)   
{   
    int j;   
    for(j=c;j<=w;j++)   
    {   
        if((d[j-c]+ww)>d[j])   
            d[j]=d[j-c]+ww;   
    }   
}   
void znpack(int c,int ww,int*d,int w)   
{   
    int j;   
    for(j=w;j>=c;j--)   
    {      
        if(d[j]<(d[j-c]+ww))   
            d[j]=d[j-c]+ww;   
    }   
}   
void mpack(int c,int ww,int nn,int*d,int w)   
{   
       
    if(c*nn>=w)   
    {   
        cpack(c,ww,d,w);   
        return;   
    }   
    int k=1;   
    while(k<nn)   
    {   
        znpack(k*c,k*ww,d,w);   
        nn=nn-k;   
        k=k*2;   
    }   
    znpack(nn*c,nn*ww,d,w);   
}   
 
int main() 

    int i,ret; 
    while(scanf("%d%d",&n,&m),n+m) 
    { 
        ret=0; 
        memset(dp,0,sizeof(dp)); 
        for(i=0;i<n;i++) 
        { 
            scanf("%d",&wu[i].w); 
            wu[i].v=wu[i].w; 
        } 
        for(i=0;i<n;i++) 
        { 
            scanf("%d",&wu[i].c); 
        } 
        for(i=0;i<n;i++) 
        { 
            if(wu[i].c) 
                mpack(wu[i].w,wu[i].v,wu[i].c,dp,m); 
        } 
        for(i=1;i<=m;i++) 
        { 
            if(dp[i]&&dp[i]!=dp[i-1]) ret++; 
        } 
        printf("%d\n",ret); 
    } 
    return 0; 

/*
問一些硬幣能組合到的錢數有多少種?
多重背包 容量等於價值的算一種
*/
#include<stdio.h>
#include<string.h>
struct node
{
 int w,v,c;
}wu[150];
int n,m;
int dp[101000];

void cpack(int c,int ww,int*d,int w) 

    int j; 
    for(j=c;j<=w;j++) 
    { 
        if((d[j-c]+ww)>d[j]) 
            d[j]=d[j-c]+ww; 
    } 

void znpack(int c,int ww,int*d,int w) 

    int j; 
    for(j=w;j>=c;j--) 
    {    
        if(d[j]<(d[j-c]+ww)) 
            d[j]=d[j-c]+ww; 
    } 

void mpack(int c,int ww,int nn,int*d,int w) 

     
    if(c*nn>=w) 
    { 
        cpack(c,ww,d,w); 
        return; 
    } 
    int k=1; 
    while(k<nn) 
    { 
        znpack(k*c,k*ww,d,w); 
        nn=nn-k; 
        k=k*2; 
    } 
    znpack(nn*c,nn*ww,d,w); 

int main()
{
 int i,ret;
 while(scanf("%d%d",&n,&m),n+m)
 {
  ret=0;
  memset(dp,0,sizeof(dp));
  for(i=0;i<n;i++)
  {
   scanf("%d",&wu[i].w);
   wu[i].v=wu[i].w;
  }
  for(i=0;i<n;i++)
  {
   scanf("%d",&wu[i].c);
  }
  for(i=0;i<n;i++)
  {
   if(wu[i].c)
    mpack(wu[i].w,wu[i].v,wu[i].c,dp,m);
  }
  for(i=1;i<=m;i++)
  {
   if(dp[i]&&dp[i]!=dp[i-1]) ret++;
  }
  printf("%d\n",ret);
 }
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved