去年写过不到六个背包题,后悔自己没有好好写。
后面大神一直aaa,压力好大啊。
大神说的我都不会。
根据背包九讲上的讲解,可以有以下的过程。
不过这样只能判断是否存在是否存在
。
用第二种方法(动态规划的思想)可以判断装满的次数。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200;
int dp[maxn][maxn];
int a[maxn];
int b[maxn];
int all;
int n;
int main()
{ int n;
cin>>n;
cin>>all;
for(int i=1;i<=n;i++)
{ cin>>a[i];
cin>>b[i];
}
//dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=all;j++)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+b[i]);
for(int i=1;i<=n;i++)
{for(int j=1;j<=all;j++)
printf("%d ",dp[i][j]);
cout<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn=2000;
int a[maxn];
int n;
int dp[maxn];
int main()
{ int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{cin>>a[i];
sum+=a[i];
}
//for(int i=0;i<=4;i++)
//dp[0][i]=1;
dp[0]=1;
/*for(int i=1;i<=n;i++)
{ // cout<<"eeeeee"<<endl;
for(int all=sum;all>=a[i];all--)
{ dp[all]+=dp[all-a[i]];//dp的思想,可以求装满的次数。
//printf("11111\n");
}
}*/
for(int i=1;i<=n;i++)
{ // cout<<"eeeeee"<<endl;
for(int all=sum;all>=a[i];all--)
{ dp[all]=max(dp[all],dp[all-a[i]]);
//printf("11111\n");
}
}
for(int j=0;j<=10;j++)
printf("%d ",dp[j]);
cout<<endl;
return 0;
}
有这个想法的原因,是室友们想了一个问题。
给一些数,取k个,得到多少和。得到和的次数。
可是那样写价值算什么。