版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84976790
p1934 [usaco2007dec_bronze]书架
题目
https://www.luogu.org/problemnew/show/P2676
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000100;
inline int read()
{
int f=1,num=0;
char ch=getchar();
while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); }
while (isdigit(ch)) num=(num<<1)+(num<<3)+(ch^48), ch=getchar();
return num*f;
}
int cnt,sum,h[maxn],f[maxn];
int main()
{
int n=read(),b=read();
for (int i=1;i<=n;++i)
h[i]=read();
sort(h+1,h+n+1);
for (int i=n;i>=1;--i)
{
if (sum>=b) break;
sum+=h[i];
++cnt;
}
printf("%d\n",cnt);
return 0;
}
本人已泪目。。。。。。。。。。。
p1116 超级书架
题目
https://www.luogu.org/problemnew/show/P2677
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000100;
inline int read()
{
int f=1,num=0;
char ch=getchar();
while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); }
while (isdigit(ch)) num=(num<<1)+(num<<3)+(ch^48), ch=getchar();
return num*f;
}
int sum,h[maxn],f[maxn];
int main()
{
int n=read(),b=read();
for (int i=1;i<=n;++i)
h[i]=read();
sort(h+1,h+1+n);
for (int i=1;i<=n;++i)
sum+=h[i];
int k=sum-b;
for (int i=1;i<=n;++i)
for (int j=k;j>=h[i];--j)
f[j]=max(f[j],f[j-h[i]]+h[i]);
printf("%d\n",k-f[k]);
return 0;
}