#include<bits/stdc++.h>
using namespace std;
const int N=1000000+5;
int n,V,cnt=0;
int c[N],w[N]; //w为价值,c为体积
int d[N];
int main(){
cin>>n>>V;
int a,b,m;
for(int i=1;i<=n;++i){
cin>>a>>b>>m;
for(int k=1;k<=m;k<<=1){ //二进制拆分
w[++cnt]=a*k;
c[cnt]=b*k;
m-=k;
}
if(m){
w[++cnt]=a*m;
c[cnt]=b*m;
}
}
// memset(d,0xcf,sizeof d); //没有初始化
d[0]=0;
for(int i=1;i<=cnt;++i){
for(int j=V;j>=c[i];--j){
d[j]=max(d[j],d[j-c[i]]+w[i]);
}
}
cout<<d[V];
return 0;
}
上面这个代码能AC
但
#include<bits/stdc++.h>
using namespace std;
const int N=1000000+5;
int n,V,cnt=0;
int c[N],w[N]; //w为价值,c为体积
int d[N];
int main(){
cin>>n>>V;
int a,b,m;
for(int i=1;i<=n;++i){
cin>>a>>b>>m;
for(int k=1;k<=m;k<<=1){
w[++cnt]=a*k;
c[cnt]=b*k;
m-=k;
}
if(m){
w[++cnt]=a*m;
c[cnt]=b*m;
}
}
memset(d,0xcf,sizeof d); //我也尝试改为memset(d,-0x3f,sizeof d),一样错
d[0]=0;
for(int i=1;i<=cnt;++i){
for(int j=V;j>=c[i];--j){
d[j]=max(d[j],d[j-c[i]]+w[i]);
}
}
cout<<d[V];
return 0;
}
会WA第1个和最后一个点
下了第一个点的数据,我的(有初始化的那个)代码跑出来604,而答案是607
求大佬解惑!