|
沙发
楼主 |
发表于 2018-10-14 11:47:22
|
只看该作者
这是一个基本背包问题的变形,一般的背包在不选择此物的时候不改变上一次的重量和价值,而此题在不使用药物的时候还可以得到lose的值,所以转移方恒也有所不同。
基本的二位数组的做法,很直观
- #include <iostream>
- #include <iomanip>
- using namespace std;
- const int mx=1100;
- const int mn=1100;
- long long f[mn][mx];
- int win[mn],lose[mn],use[mn];
- int n,x,r,c,i;
- long long t1,t2;
- int main()
- {
- cin>>n>>x;
- for (i=1; i<=n; i++) cin>>lose[i]>>win[i]>>use[i];
- for(r=1; r<=n; r++)
- for(c=0; c<=x; c++)
- {
- t1=f[r-1][c]+lose[r];
- if (c>=use[r]) t2=f[r-1][c-use[r]]+win[r];else t2=0;
- f[r][c]=max(t1,t2);
- }
- /*for(r=1; r<=n; r++)
- {
- for(c=0; c<=mj-1; c++) cout<<setw(4)<<f[r][c];
- cout<<endl;
- }
- */
- cout<<5*f[n][x];
- return 0;
- }
复制代码
要是用一维数组就得有些技巧了。不同套用以前的那种写法。
- #include <iostream>
- #include <iomanip>
- using namespace std;
- const int mn=1100;
- long long f[1100];
- int win[mn],lose[mn],use[mn];
- int n,x,r,c,i;
- long long t1,t2;
- int main()
- {
- cin>>n>>x;
- for (i=1; i<=n; i++) cin>>lose[i]>>win[i]>>use[i];
- for (r=1; r<=n; r++)
- for(c=x; c>=0; c--)
- {
- t1=f[c]+lose[r];
- if (c>=use[r]) t2=f[c-use[r]]+win[r];
- else t2=0;
- f[c]=max(t1,t2);
- }
- cout<<5*f[x];
- return 0;
- }
复制代码 |
|