@kaike
呐么简单我还需要专门写篇博客记录一下?
0/1 背包问题
大经典问题你不记录想等以后忘记嘛
f[i]=max(f[i],f[i-weight]+value)
当前的最优值就是加不加这个东西的价值
依次递推
最大值就是在背包满的时候辣
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int t,m,f[1010],maxx=0; 6 struct qwq 7 { 8 int tt,vv; 9 }a[150]; 10 int main() 11 { 12 memset(f,0,sizeof(f)); 13 //若要求“恰好装满”,f[0]=0,f[i]=-INF 14 //若不用恰好,全部为0 15 cin>>t>>m; 16 for(int i=1;i<=m;i++) 17 cin>>a[i].tt>>a[i].vv;//应该用两个数组的,毕竟不用排序,太蠢辣 18 for(int i=1;i<=m;i++)//枚举草药 19 for(int j=t;j>=a[i].tt;j--)//枚举剩下的空间 20 f[j]=max(f[j],f[j-a[i].tt]+a[i].vv);//记住大工式可以解决好多问题 21 cout<<f[t]<<endl;//最大值不在草药那里,在时间那里,记住辣 22 return 0; 23 }