poj 3624 (01背包一维数组)

①这种问题要看清楚变量范围 数组范围很容易开错!!!

②这个下限是w[i]!!!很重要 或者加一句判断  if(j-w[i]>=0) 

1  for(int i=1;i<=t;i++)
2         {
3             for(int j=n;j>=w[i];j--)//下限!!!
4                 dp[j]=max( dp[j] , dp[j-w[i]]+v[i] );
5         }

AC代码,一维数组可以压缩空间。

 1 #include  <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 const int maxn_da=3500;
 6 const int maxn_dp=13000;
 7 int dp[maxn_dp];
 8 int v[maxn_da];
 9 int w[maxn_da];
10
11 int main()
12 {
13     int t,n;
14     while(cin>>t>>n)
15     {
16         for(int i=1;i<=t;i++)
17         {
18             cin>>w[i]>>v[i];
19         }
20
21         memset(dp,0,sizeof(dp));
22
23         for(int i=1;i<=t;i++)
24         {
25             for(int j=n;j>=w[i];j--)
26                 dp[j]=max( dp[j] , dp[j-w[i]]+v[i] );
27         }
28         cout<<dp[n]<<endl;
29     }
30
31     return 0;
32 }

时间: 2024-10-10 14:40:16

poj 3624 (01背包一维数组)的相关文章

POJ 3624 01背包

初学DP,用贪心的思想想解题,可是想了一个多小时还是想不出. //在max中的两个参数f[k], 和f[k-weight[i]]+value[i]都是表示在背包容量为k时的最大价值 //f[k]是这个意思,就不用说了. //而f[k-weight[i]]+value[i]也表示背包容量为k时的最大价值是为什么呢? //首先,f[k-weight[i]]表示的是背包容量为k-weight[i]的容量,也就是说f[k-weight[i]] //表示的是容量还差weiht[i]才到k的价值,+walu

c++01背包一维数组版及java多重背包

#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1010; int c[maxn],w[maxn]; int dp[maxn]; int main(){ int n,v; cin>>n>>v; for(int i=1;i<=n;i++) cin>>c[i]; for(int i=1;i<=n;i++) cin>>w[i];

poj 2184 0---1背包的变形

这题是0--1背包的变形,对理解0--1背包有很大的帮组 题意:要选一些牛去参见展览,每个牛有幽默.智慧两个选择标准,要求选的这些牛使得幽默和智慧的总和最大且幽默和智慧的每个总和都必须是大于等于0: 刚看的这个题目是时候,知道是一个0--1背包的的题目,但就是不知道怎么来写出状态转移方程,因为题中的两个变量都是有负值的. 看了大牛的解题报告才知道. 我们可以把幽默个变量看成是体积 , 智慧看成是价值. 我们可以把每个牛幽默的值 , 放在一个坐标上,让后整体往右移,使得最小值为 0 , 那么这时候

poj 1837 01背包

Balance Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Gigel has a strange "balance" and he wants to poise it. Actually, the device is different fr

矩阵(01背包+滚动数组)

题意: 有一个\(n×m\)的矩阵,你从左上角走到右下角,只能向下和向右走.每个点上有一个重量\(v_{i,j}\) 价值\(w_{i,j}\)的物品,你有一个容量为S的背包,经过一个点你可以将此点的物品放入背包,求最大能得到的价值. 分析: \(f_{i,j,k}\)表示走到\((i,j)\),背包剩余容量为 k 时的最大价值. \(f_{i,j}\)由\(f_{i-1,j}\)和\(f_{i,j-1}\)按普通 01 背包的方法转移. 时间复杂度 \(O(N^2V)\),空间复杂度 \(O(

POJ 2184 01背包+负数处理

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10200   Accepted: 3977 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to

Cow Exhibition POJ 2184(01背包dp)

原题 题目链接 题目分析 明显的01背包,但还是由细节需要处理,设置dp[i][j]=前i头牛中选的TF为j时最大的TS值,由于TF可能为负数因此要加一个基数使其在大于等于零,dp初始化为-1,dp[0][0]=0.更新的时候dp[i][j]=max(dp[i-1][j-f[i]]+s[i],dp[i-1][j]).观察这个dp的更新可以发现能状态压缩,当f[i]>=0时,j从大到小更新,当f[i]<0时,j从小到大更新.最后从基数往上扫dp[j]+j-基数的最大值就是答案,注意前提是dp[i

POJ之01背包系列

poj3624 Charm Bracelet 模板题 没有要求填满,所以初始化为0就行 #include<cstdio> #include<iostream> using namespace std; #define N 15010 int n,m,v[N],c[N],f[N]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&am

poj3624 Charm Bracelet(0-1背包 滚动数组)

题目链接:https://vjudge.net/problem/POJ-3624 题意:有N个物品,分别有不同的重量Wi和价值Di,Bessie只能带走重量不超过M的物品,要是总价值最大,并输出总价值. 一开始使用正常的dp然后显示超内存,按下面代码也超内存(dp数组太大了)但这种方法可以学习一下 #include <iostream> #include <cstring> using namespace std; int n,m; //int w[3403],d[12881];