hihoCoder 1043 : 完全背包

来源:互联网 发布:大数据安全需求分析 编辑:程序博客网 时间:2024/06/05 22:36

题意:见原题。


思路:dp(i,j)表示用体积j来装前i个物体能得到的最大价值,由于第i个物品可以装多次,所以转移方程应该是dp(i,j)=max{dp(i,jneed(i)),dp(i1,j)}
空间优化:dp(i,2)用来滚动得到当前的值,注意递增枚举体积,因为大的体积依赖于小的体积。

AC代码

#include <cstdio>#include <cmath>#include <cctype>#include <bitset>#include <algorithm>#include <cstring>#include <utility>#include <string>#include <iostream>#include <map>#include <set>#include <vector>#include <queue>#include <stack>using namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10#define inf 0x3f3f3f3f#define PI pair<int, int> typedef long long LL;const int maxn = 1e5 + 5;int dp[maxn][2];int need[505], value[505];int main() {    int n, V;    while(scanf("%d%d", &n, &V) == 2) {        for(int i = 1; i <= n; ++i) {            scanf("%d%d", &need[i], &value[i]);        }        memset(dp, 0, sizeof(dp));        int f = 1;        for(int i = 1; i <= n; ++i) {            for(int j = 0; j <= V; ++j) {                if(j < need[i]) dp[j][f] = dp[j][f^1];                 else dp[j][f] = max(dp[j][f^1], dp[j-need[i]][f]+value[i]);            }            f ^= 1;        }        printf("%d\n", dp[V][f^1]);    }    return 0;}

如有不当之处欢迎指出!

原创粉丝点击