[JZOJ P1270] [DP]采药

@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 }
你好蠢

 

 

 

posted @ 2016-10-09 18:05  kaike  阅读(172)  评论(0编辑  收藏  举报