void solve(int v,int w,int c)
{
    int count=0;
    for(int k=1;k<=c;k<<=1)
    {
        val[count]=k*v;
        size[count++]=k*w;
        c-=k;    
    }
    if(c>0)
    {
        val[count]=c*v;
        size[count++]=c*w;
    }
    for(int i=0;i<count;i++)
    {
        cout<<val[i]<<"  "<<size[i]<<endl;
    }
}

多重转为01模版

hdu 3732

思路:因为v,w都是0到10的数 ,所以会有很多v和w重复,把他们统计出数量,弄成多重背包,然后二进制优化,转为01

#include <string>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <iostream>
using namespace std;
int cnt;
int v[100005];
int w[100005];
int dp[10005];
int n,m;
void change(int a,int b,int c)
{
    int k=1;
    for(k=1;k<=c;k<<=1)
    {
        /*v[cnt]=k*a;
        w[cnt++]=k*b;*/
        for(int j=m;j>=k*b;j--)
        {
            dp[j]=max(dp[j],dp[j-k*b]+k*a);
        }
        c-=k;
    }
    if(c>0)
    {
        /*v[cnt]=k*a;
        w[cnt++]=k*b;*/
        for(int j=m;j>=c*b;j--)
        {
            dp[j]=max(dp[j],dp[j-c*b]+c*a);
        }
    }
    return;
}
int main()
{
    int a,b;
    int map[11][11];
    char s[1005];
    while(~scanf("%d %d",&n,&m))//记得加~或者EOF 不然你怎么优化都是超时
    {
        memset(map,0,sizeof(map));
        memset(dp,0,sizeof(dp));
        cnt=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s %d %d",&s,&a,&b);
            getchar();
            map[a][b]++;
        }
        for(int i=1;i<11;i++)
        {
            for(int j=1;j<11;j++)
            {
                if(map[i][j]>0)
                {
                    int k=1;
                    int c=map[i][j];
                    for(k=1;k<=c;k<<=1)
                    {
                        /*v[cnt]=k*a;
                        w[cnt++]=k*b;*/
                        for(int s=m;s>=k*j;s--)
                        {
                            dp[s]=max(dp[s],dp[s-k*j]+k*i);
                        }
                        c-=k;
                    }
                    if(c>0)
                    {
                        /*v[cnt]=k*a;
                        w[cnt++]=k*b;*/
                        for(int s=m;s>=c*j;s--)
                        {
                            dp[s]=max(dp[s],dp[s-c*j]+c*i);
                        }
                    }
                }
            }
        }
        /*for(int i=0;i<cnt;i++)
        {
            for(int j=m;j>=w[i];j--)
            {
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
        }*/
        printf("%d\n",dp[m]);
    }
    return 0;
}

最新文章

  1. android 事件监听
  2. C# JavascriptSerializer与匿名对象打造Json的完美工具
  3. Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流的解决方法
  4. 【Cocos2d入门教程四】Cocos2d-x菜单篇
  5. salt-API基本验证命令
  6. javascrip实现无缝滚动
  7. Eclipse相关集锦
  8. Java集合实现
  9. &lt;转&gt;Python中的新式/经典类的查找方式
  10. [C++]2-1 水仙花数
  11. Rsync + Sersync 实现数据增量同步
  12. 反转链表(python3)
  13. &lt;&lt;、|=、&amp;的小例子
  14. Unity Shader序列帧动画学习笔记
  15. poj 1328 Radar Installation 排序贪心
  16. SQL plus连接远程Oralce数据库
  17. java 多线程7: (suspend方法与resume方法) 挂起与恢复
  18. Power Designer逆向工程导入Oracle表,转为模型加注释
  19. 【sql】关联查询+表自关联查询
  20. 第一个AngularJS控制器

热门文章

  1. 阿里云slb上传证书错误
  2. [BJWC2011]禁忌 AC 自动机 概率与期望
  3. d3的一些总结
  4. HDU-2050 折线分割平面 找规律&amp;递推
  5. caioj 1073 动态规划入门(三维一边推:最长公共子序列加强版(三串LCS))
  6. Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)
  7. BZOJ3376: [Usaco2004 Open]Cube Stacking 方块游戏
  8. ToF相机学习笔记之基本知识
  9. 在performancepoint里面建立数据源的时候,总是发生以下的报警
  10. FreeBSD是UNIX系统的重要分支,其命令与Linux大部分通用,少部分是其特有。