hdu 3449Consumer(依赖背包)
src:http://acm.hdu.edu.cn/showproblem.php?pid=3449
dp值为-1不可转移(买不起对应的boxes),>=0可转移;

ac代码:
#include <iostream> #include<cstdlib> #include<algorithm> #include<cmath> #include<functional> #include<utility> #include<string> #include<string.h> #include<vector> #include<iomanip> #include<stack> using namespace std; #define FOR(i,a,b) for(int i=a;i<=b;i++) const int inf=99999999; int n,w,p,m,dp[55][100005],c,v; int main() { std::ios::sync_with_stdio(false); while(cin>>n>>w){ memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ cin>>p>>m; for(int k=0;k<p;k++)dp[i][k]=-1;//比p小的容量连盒子都买不起,因此不可转移 for(int k=p;k<=w;k++)dp[i][k]=dp[i-1][k-p];//大于p的买了盒子,因此从[i-1][k-p]转移过来, for(int j=1;j<=m;j++){ //理解起来就是,只有p+1到w可以转移,也就是说只有w-p的代价可以使用 cin>>c>>v; //以上处理过后的dp[i]才是i物品要进行动态地规划的值 for(int k=w;k>=c&&k>=p+c;k--){ //(即对于k空间我放了i物品后剩下的空间最多能放的东西减少了,理解见笔记的那幅图~~~ dp[i][k]=max(dp[i][k],dp[i][k-c]+v); } } FOR(k,0,w)dp[i][k]=max(dp[i][k],dp[i-1][k]); } cout<<dp[n][w]<<endl; } return 0; }

浙公网安备 33010602011771号