【DP】NOI题库 6049买书 && 4976硬币

1.点击前去买书

2.点去前往火星


T1:6045 买书

很水的背包问题

真是01背包….把要买的书价格想成背包空间就行了

代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

const int maxn = 10001;

using namespace std;

int n;
int kd[4]={10,20,50,100};
int dp[maxn];

void rd(int &x)
{
    scanf("%d",&x);
}

int main()
{
    rd(n);
    dp[0] = 1;
    for(int i = 0;i <= 4;i++)
        for(int j = kd[i]; j <= n;j++) {dp[j] += dp[j - kd[i]];}
    printf("%d\n",dp[n]);

return 0;
}

T2:4976 硬币

改了下题面:

交易员B♂b有一天来到了被遗忘之地“新日暮里”,作为交易员B♂b有收集py的习惯(职业病没办法)。于是他将新日暮里上所有大小的py都收集起来了(当然森之妖精与赤酱除外,因为就算最强大的交易员也无法将森之妖精打败,而赤酱可是新日暮里的守护神啊,就算交易员交易技巧再强也只是人类(DIO除外)怎么能与神匹敌),py一共有n种,每种只有一个(当然):大小分别为p1,p2… pn, 共计 n种,py的大小是可以叠加的,即如果有 p1 = 1,p2 = 2,p3 = 3,则有p3 = p1 + p2。当B♂b完成在新日暮里最后一天的交易,他在更衣室看到了一块自己特别喜欢的SOAP,想拿来送给自己的朋友暗之大统领,但这块SOAP受到赤酱的封印,只有奉上X大小的py才能换得。B♂b想尽量少用些py所以B♂b很想知道为了解除封印他的哪些py是必须被供奉的,即B♂b必须放弃收集好的py种类。封印可不提供”找零”,只接受大小恰好为X的py。

咳咳进入正题

这个题就是加了一点点小特技的T1,同样是简单的背包问题,只是最后依次判断下能否没有某种py就可以了

代码如下

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

const int maxn = 10010;

using namespace std;

int n,x,tot;
int a[maxn >> 2];
int darkpower[maxn >> 2];
int dp[maxn];

inline int cnbb(int x,int v)
{
    if(x < 0) return 0;
    else return dp[x] - cnbb(x-v,v);
}

inline void rd(int &t)
{
    scanf("%d",&t);
}

void init()
{
    memset(dp,0,sizeof(dp));
    memset(darkpower,0,sizeof(darkpower));
    memset(a,0,sizeof(a));
    dp[0] = 1;
}

int main()
{
    rd(n);rd(x);
    for(int i = 1;i <= n;i++) rd(a[i]);
    for(int i = 1;i <= n;i++)
        for(int j = x;j >= a[i];j--) dp[j] += dp[j - a[i]];
    for(int i = 1;i <= n;i++)
        if(!(dp[x] - cnbb(x - a[i],a[i])))
        {
            darkpower[++tot] = a[i];
        }
    printf("%d\n",tot);
    for(int i = 1;i <= tot;i++) printf("%d ",darkpower[i]);
    return 0;
}

THE END

By Peacefuldoge

http://blog.csdn.net/loi_peacefuldog

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值