codevs 1795 金字塔 2
codevs 1795 金字塔 2
这个题比完全背包多了一个总数的限制,即一定要选(m+n)个,题中说总重量不超过n,所以至少选择m个重量为0的,然后初始化的时候,都填成重量为0的,然后再一个个地把它们拿出来,做完全背包。
#include<iostream> #include<cstdio> #include<cstring> #include<ctime> #include<algorithm> #include<queue> #define inf 2147483647 #define For(i,a,b) for(register int i=a;i<=b;i++) #define p(a) putchar(a) #define g() getchar() using namespace std; int n,m; int v[3010]; int f[3010]; void in(int &x) { int y=1; char c=g();x=0; while(c<'0'||c>'9') { if(c=='-') y=-1; c=g(); } while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar(); x*=y; } void o(int x) { if(x<0) { p('-'); x=-x; } if(x>9)o(x/10); p(x%10+'0'); } int main() { in(n),in(m); For(i,0,n) in(v[i]); For(i,0,n) f[i]=(n+m)*v[0]; For(i,1,n) For(j,i,n) if(f[j-i]+v[i]-v[0]>f[j]) f[j]=f[j-i]+v[i]-v[0]; o(f[n]); return 0; }