新年趣事之打牌----VIJOS_1071----01背包加强版_01背包(数据加强版)_小黑妹的博客-程序员宅基地

技术标签: output  活动  path  input  DP  

目地址http://www.vijos.org/Problem_show.asp?id=1071


From xiaomengxian
新年趣事之打牌 新年趣事 系列 
描述 Description
过年的时候,大人们最喜欢的活动,就是打牌了。xiaomengxian不会打牌,只好坐在一边看着。
  这天,正当一群人打牌打得起劲的时候,突然有人喊道:“这副牌少了几张!”众人一数,果然是少了。于是这副牌的主人得意地说:“这是一幅特制的牌,我知道整副牌每一张的重量。只要我们称一下剩下的牌的总重量,就能知道少了哪些牌了。”大家都觉得这个办法不错,于是称出剩下的牌的总重量,开始计算少了哪些牌。由于数据量比较大,过了不久,大家都算得头晕了。
  这时,xiaomengxian大声说:“你们看我的吧!”于是他拿出笔记本电脑,编出了一个程序,很快就把缺少的牌找了出来。
  如果是你遇到了这样的情况呢?你能办到同样的事情吗?
输入格式 Input Format
第一行一个整数TotalW,表示剩下的牌的总重量。
  第二行一个整数N(1<N<=100),表示这副牌有多少张。
  接下来N行,每行一个整数Wi(1<=Wi<=1000),表示每一张牌的重量。
输出格式 Output Format
如果无解,则输出“0”;如果有多解,则输出“-1”;否则,按照升序输出丢失的牌的编号,相邻两个数之间用一个空格隔开。
样例输入 Sample Input
270
4
100
110
170
200

样例输出 Sample Output

2 4

首先要理解题目的意思。这个题目的意思是说,现在有一堆丢失了的牌,知道他们的总重量,然后知道每一种牌的重量,要你求到底是丢失了哪几张牌。如果无法确定则输出0,如果有很多种情况,则输出-1,否则按牌号的大小一次输出缺的牌。

由于本题目引入了重量的概念,所以既然剩下的牌的总重量知道,那我只需要用01背包方法求出怎样才能用给出的牌种组成剩下的牌,没拿进来的牌就是缺的牌。只不过我们要对这个做一个记录。记录哪些牌拿进来了,哪些没有。用一个数组judge[i]来记录是否加进来了。用数组num[v]来记录当把容量为V的正好装满的时候所用的牌的牌号i,用dp[v]来表示装满容量为v的所有方案数。初值dp[0]=1,其余为0.下面上代码更容易懂。

 

代码:

#include<iostream>
using namespace std;
int w[110];
bool ans[110];
int path[100010];
int dp[100010];
int main()
{
    int total,n,i,j;
    while(scanf("%d",&total)!=EOF)
    {
       scanf("%d",&n);
       for(i=1;i<=n;i++)
       {
          scanf("%d",&w[i]);
       }
       memset(dp,0,sizeof(dp));
       memset(ans,true,sizeof(ans));
       dp[0]=1;
       for(i=1;i<=n;i++)
        for(j=total;j>=w[i];j--)
           if(dp[j-w[i]]>0)
           {
             if(dp[j]==0) path[j]=i;
             dp[j]+=dp[j-w[i]];
           }
        if(dp[total]==0)
         { printf("0\n");break;}
        if(dp[total]>1)
        { printf("-1\n");break;}
        i=total;
        while(i>0)
        {
          ans[path[i]]=false;
          i=i-w[path[i]];
        }
        for(i=1;i<=n;i++)
          if(ans[i]) printf("%d ",i);
        printf("\n");
        
  }
  return 0;
}


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hellobabygogo3/article/details/8010268

智能推荐

mysql学习笔记-子查询(嵌套查询)_mysql8.0子查询有数量限制吗-程序员宅基地

子查询子查询(subquery),就是嵌套在其他查询中的查询。举例:订单存储在两个表中。每个订单包含订单编号、客户ID、订单日期,在Orders表中存储为一行。各订单的物品存储在相关的OrderItems表中。Orders表不存储顾客信息,只存储顾客ID。顾客的实际信息存储在Customers表中。现在需要列出订购物品RGAN01的所有顾客语句:SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderIte_mysql8.0子查询有数量限制吗

gitlab的webhooks url-程序员宅基地

http://192.168.1.130:8050/gitlab/build_now192.168.1.130:8050为jenkins的IP和端口 转载于:https://my.os..._gitlab hook url

踩坑--启动Hbse报错: Name or service not knownstname hadoop001_hbaseshell命令建表报错未知的名称或服务-程序员宅基地

今天在启动Hbase 服务时,报错 ,Name or service not knownstname hadoop001,但是,在配置文件中已经,配置了Region Server,后面,想到可能是文件,格式有问题,是dos 不是unix 的因为,楼主使用了window环境编辑了该文件:vi regionservers;使用命令:set ff? 查看文件格式:set..._hbaseshell命令建表报错未知的名称或服务

JavaScript DOM对象 事件_js dom元素触发mouseover-程序员宅基地

一、事件流事件流描述的是从页面中接受事件的顺序1、事件流类型事件冒泡流 默认事件捕获流 2、DOM0级事件 1.给一个元素对象绑定同一个事件多次,出现覆盖问题 2.无法修改事件流的类型 3、DOM2级事件添加监听事件..._js dom元素触发mouseover

密码学09(SM3算法)-程序员宅基地

SM3算法SM3密码摘要算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。SM3算法适用于商用密码应用中的数字签名和验证,接受文本大小要小于264位,并以512位为单位分组,输出长度为256位的摘要与SHA算法大体相似。消息填充使报文长度与448mod512同余,最后64位存放报文长度。其中填充位数在1到512之间(注意没有0,也就是说一个长为448位的明文,需要再填充51..._sm3算法

velocity 各种判断为null或者“null”或者“”总结_velocity判断null-程序员宅基地

在web开发中,经常会遇到一个需求是,判断变量为空(null)或者空字符串(""),从而影响页面的展示逻辑,velocity中有相应的方法可以判断。当然也可以在java后端转化到有效值再判断。以下是本人在开发中自己总结的,希望对大家有所帮助!(1)判断null#if( $name == null) something code#end(2)判断null或者false#if( !$na_velocity判断null

随便推点

C#中的多线程 - 同步基础 z-程序员宅基地

原文:http://www.albahari.com/threading/part2.aspx专题:C#中的多线程1同步概要Permalink在第 1 部分:基础知识中,我们描述了如何在线程上启动任务、配置线程以及双向传递数据。同时也说明了局部变量对于线程来说是私有的,以及引用是如何在线程之间共享,允许其通过公共字段进行通信。下一步是同步(synchronization)..._c# ata线程

第四章和第十七章阅读笔记-程序员宅基地

阅读了第四章和第十七章,了解了一些全新的概念,对开发流程有了更深的体会。第四章:1原文:在结对编程模式下, 一对程序员肩并肩、 平等地、 互补地进行开发工作。 他们并排坐在一台电脑前, 面对同一个显示器, 使用同一个键盘、 同一个鼠标一起工作。 他们一起分析, 一起设计,一起写测试用例, 一起编码, 一起做单元测试,一起做集成测试, 一起写文档等。 结对编程不是程序开发者...

java:程序包org.springframework.boot不存在_懒惰的小妖的博客-程序员宅基地

启动项目,报java:程序包org.springframework.boot不存在,查看项目下的Application是存在的解决:查看maven配置,配置没问题,点击maven-->runner,勾选Delegate IDE build/run actions to Maven;再次启动ok!

eclipse3.5插件-程序员宅基地

jad Eclipse插件很多人使用的,要是Eclipse没有的话是应该最郁闷的,今天终于找了个替代品java decompile,他的插件安装地址:http://java.decompiler.free.fr/jd-eclipse/update/还有一些不错的插件推荐下,本人亲自测试保证有用: 开发js相当不错的插件 aptana - http://update15.aptana.o

python中几种实现阶乘的方法_python阶乘n!的代码-程序员宅基地

普通的for循环实现阶乘a = 1n = 5for i in range(1,n+1): a = a * iprint(a)2.python中,用while循环语句,算阶乘>>> def func(n): s=1 while(n): s*=n n-=1 return s>>> func(3)63.函数中用whil..._python阶乘n!的代码