8-10

来源:互联网 发布:足球数据app 编辑:程序博客网 时间:2024/05/21 21:07

无聊时候写博客,说不定会找到一些趣味。敲打


今年天讲了背包,我只看了一些原理的东西 01背包问题和完全背包问题

感觉这些东西比前面讲的要难些


今天看了别人的博客发现大牛真多,还有一个在那讲泰勒公式,把我佩服的真的是五体投地

路漫漫其修远兮,吾将上下而求索。


在这奉上链接,有兴趣可以看一下。

点击打开链接


还有就是以前不会做的题现在,再看就没那么难了。学习需要一个过程。


然后还做了一些并查集的问题

点击打开链接

点击打开链接

点击打开链接


01背包 完全背包       模板

//dp[102][10010];
//10^6
//dp[102][10010];   dp[i][j]  --- i(1-i)   j(容量)  价值   
/*


dp[i][j]   <--   dp[i-1][j] 
dp[i][j]   <--   dp[i-1][j-w[i]]++p[i];


*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[102][10010];
int w[102];
int p[102];
int main(){
int n,W;
scanf("%d%d",&n,&W);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&p[i]);
}
for (int i=0;i<=W;i++)
dp[0][i]=0;
for (int i=1;i<=n;i++){
for (int j=0;j<w[i]&&j<W;j++)
dp[i][j]=dp[i-1][j];
for (int j=w[i];j<=W;j++){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+p[i]);
// dp[i][j]   <--   dp[i-1][j] 
// dp[i][j]   <--   dp[i-1][j-w[i]]++p[i];
}
}
/*

完全背包 
dp[10010];


for (int i=1;i<=n;i++)  i物品   


0-W

j

j+w[i]  --- dp[j] 
 
for (int j = w[i];j<=W;j++)
dp[j] = max(dp[j],dp[j-w[i]]+p[i])
// w[i] = 2; p[i]=2;
// dp[2] = max(dp[2],dp[2-w[i]+p[i])---  2
// dp[4] = max(dp[4],dp[4-w[i]+p[i])---  4

01背包
for (int i=1;i<=n;i++)
for (int j = W;j>=w[i];j--)
{
dp[j] = max(dp[j],dp[j-w[i]]+p[i])

// dp[4] = max(dp[4],dp[2]+p[i])---  2
// dp[2] = max(dp[2],dp[2-w[i]]+p[i])---  2
}
*/
}



#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[102][10010];
int w[102];
int p[102];
int main(){
int n,W;
scanf("%d%d",&n,&W);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&p[i]);
}
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;i++){
for (int j=0;j<w[i]&&j<W;j++)
dp[i][j]=dp[i-1][j];
for (int j=w[i];j<=W;j++){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+p[i]);
// printf("%d  %d    %d   %d\n",i,j,w[i],dp[i][j]);
}
}
printf("%d\n",dp[n][W]);
return 0;
}