Vjios1836_HYS与七夕节大作战

来源:互联网 发布:苹果电脑装office软件 编辑:程序博客网 时间:2024/04/27 18:48

因为本身楼主对于编程这方面很菜,所以请多多包容,谢谢。

//下面是正文

这道题其实就是一个很简单的背包问题,关键是如何计算带有小数位的数

我的想法非常简单,就是把小数化成整数,也就是乘10000,程序是这样的:

for(i=1;i<=n;i++) {cin>>h>>b[i];a[i]=h*10000;}
这里a[ ]表示占用时间百分比,b[ ]是价值。

当我们用这样的程序提交时,会发生超时:

#include <bits/stdc++.h>using namespace std;long a[10001];long double f[1000005],b[10001];int main(){memset(f,0,sizeof(f));int i,k,l,n,m;long j;cin>>n;long double h;for(i=1;i<=n;i++) {cin>>h>>b[i];a[i]=h*10000;}for(i=1;i<=n;i++) {for(j=1000000;j>=a[i];j--) {f[j]=max(f[j],f[j-a[i]]+b[i]);}}cout<<f[1000000]<<endl;return 0;}

如果数组a[]扩大10000,明显循环了很多数,所以我就把循环内容和数组都缩小成了原来的1/10:

#include <bits/stdc++.h>using namespace std;long a[10001];long double f[2400005],b[10001];int main(){memset(f,0,sizeof(f));int i,k,l,n,m;long j;cin>>n;long double h;for(i=1;i<=n;i++) {cin>>h>>b[i];a[i]=h*1000;}for(i=1;i<=n;i++) {for(j=100000;j>=a[i];j--) {f[j]=max(f[j],f[j-a[i]]+b[i]);}}cout<<f[100000]<<endl;return 0;}
这样我们就可以AC了。

1 0
原创粉丝点击