当前位置: 代码迷 >> 综合 >> HDU 2191 珍惜现在,感恩生活 多重背包 .
  详细解决方案

HDU 2191 珍惜现在,感恩生活 多重背包 .

热度:30   发布时间:2023-09-23 06:35:13.0

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2191

把我所知道的优化全部放上去了 0MS

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=10000+5;
int d[maxn];
int main()
{int T; cin>>T;while(T--){int P,N,p,w,n,k; cin>>P>>N;memset(d,0,sizeof(d));for(int i=1;i<=N;i++){scanf("%d%d%d",&p,&w,&n);if(p>P) continue;if(n*p>=P){  //完全背包 for(int i=p;i<=P;i++)d[i]=max(d[i],d[i-p]+w);continue;}k=1;while(n>k){for(int i=P;i>=k*p;i--)d[i]=max(d[i],d[i-k*p]+k*w);n-=k; k<<=1;}for(int i=P;i>=n*p;i--)d[i]=max(d[i],d[i-n*p]+n*w);}cout<<d[P]<<endl;}return 0;
}