今天的采药very crazy(P1616)
不就是完全背包
然后
#include<iostream> using namespace std; int n,m,s=0x3f3f3f3f; int w[1001],v[1001]; int f[1001][1001]; int main() { cin>>m>>n; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(j>=w[i]) f[i][j]=max(f[i][j-w[i]]+v[i],f[i-1][j]); else f[i][j]=f[i-1][j]; } } cout<<f[n][m]; return 0; }

五颜六色
然后

我……
过了3s
#include<iostream> using namespace std; int n,m,s=0x3f3f3f3f; int w[10001],v[10001]; int f[10001][10000001]; int main() { cin>>m>>n; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(j>=w[i]) f[i][j]=max(f[i][j-w[i]]+v[i],f[i-1][j]); else f[i][j]=f[i-1][j]; } } cout<<f[n][m]; return 0; }

编译器(内存)爆了!
又过了100s
#include<iostream> using namespace std; int n,m,s=0x3f3f3f3f; int w[10001],v[10001],f[10000001]; int main() { cin>>m>>n; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) { for(int j=w[i];j<=m;j++) { f[j]=max(f[j-w[i]]+v[i],f[j]); } } cout<<f[m]; return 0; }

?????????

数组应该开long long(这明显超了int)
终于
#include<iostream> using namespace std; int n,m,s=0x3f3f3f3f; long long w[10001],v[10001],f[10000001]; int main() { cin>>m>>n; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) { for(int j=w[i];j<=m;j++) { f[j]=max(f[j-w[i]]+v[i],f[j]); } } cout<<f[m]; return 0; }
