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