zoukankan      html  css  js  c++  java
  • HDOJ 2844 Coins 多重背包

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2844

    本题为简单多重背包,

    解题源码及注释如下:

    #include<stdio.h>
    #include<string.h>
    int w[101],c[101],dp[100100];
    int max(int a,int b)
    {
    	return a > b ? a : b;
    }
    int main()
    {
    	int n,m,num;
    	int i,j,k;
    	while(scanf("%d%d",&n,&m) != EOF && (m||n))
    	{
    		for(i = 0; i < n; i++)
    			scanf("%d",w+i);
    		for(i = 0; i < n; i++)
    			scanf("%d",c+i);
    		memset(dp,0,sizeof(dp));
    		for(i = 0; i < n; i++)
    		{
    			if(w[i] * c[i] > m)//完全背包
    			{
    				for(j = w[i] ; j <= m; j++)
    					dp[j] = max(dp[j],dp[j - w[i]] + w[i]);
    			}
    			else
    			{
    				k = 1;
    				while( k < c[i])
    				{
    					for(j = m; j >= w[i]*k ; j--)//0 1 背包
    							dp[j] =max(dp[j], dp[j - w[i]*k] + w[i]*k);
    					c[i] -= k;					//k个是否放
    					k <<= 1 ;					//下一次放的个数为这次的两倍
    				}
    				//将剩余的物品全都放入背包
    				for(j = m; j >= w[i] * c[i] ; j--)
    						dp[j] = max(dp[j],dp[j-w[i]*c[i]]+w[i]*c[i]);
    			}
    		}
    		num = 0;
    		for(i = 1 ; i <= m; i++)
    			if(dp[i] == i)num++;//当dp[i] == i表示价值为i的物品可以购买即背包容量为i的时候“恰好装满”
    			printf("%d\n",num);
    	}
    	return 0;
    }


     

  • 相关阅读:
    C#中平方与n次方
    哈希算法
    C#QQ邮箱发送消息
    C#Unicode和Utf-8
    timeStamp(时间戳)
    GetHashCode
    获取XML中指定属性的值
    MySQL基础之创建和操纵表
    django基础之Django模型
    django基础之Django简介
  • 原文地址:https://www.cnblogs.com/LUO257316/p/3220843.html
Copyright © 2011-2022 走看看