背包DP
P2340 [USACO03FALL] Cow Exhibition G
- 题意:
有
- 思路:
我们发现,跟状态有关的三个值:
#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
inline ll rd(){
ll x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=1ll*x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int n;
struct cow{
int a,b;
}c[450];
ll sum[1800002];
void init(){
n=rd();
for(int i=1;i<=n;i++) c[i].a=rd(),c[i].b=rd();
}
void solve(){
memset(sum,-0x3f,sizeof sum);
sum[400000]=0;
for(int i=1;i<=n;i++){
if(c[i].a>=0){
for(int j=800000;j>=c[i].a;j--){
sum[j]=max(sum[j],sum[j-c[i].a]+c[i].b);
}
}
else{
for(int j=0;j<=800000+c[i].a;j++){
sum[j]=max(sum[j],sum[j-c[i].a]+c[i].b);
}
}
}
}
void print(){
ll maxx=-1e8;
for(int i=400000;i<=800000;i++)
if(sum[i]>=0)
maxx=max(maxx,sum[i]+i-400000);
cout<<maxx;
}
signed main(){
init();
solve();
print();
}
P3188 [HNOI2007] 梦幻岛宝珠
- 题意:
有
- 思路:
一看是
关于
#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=105;
int n,W;
struct dn{
int a,b,len,x;
}z[N];
int f[50][12000],g[50][12000];
vector<int> val[51],k[51];
void init(int n){
memset(f,0,sizeof f);
memset(g,0,sizeof g);
for(int i=0;i<=50;i++) val[i].clear(),k[i].clear();
for(int i=1;i<=n;i++){
scanf("%d%d",&z[i].a,&z[i].b);
z[i].len=0;
while(((z[i].a>>z[i].len)&1)==0){
z[i].len++;
}
z[i].x=z[i].a;
val[z[i].len].push_back(z[i].b);
k[z[i].len].push_back((z[i].x>>z[i].len));
}
int l=0;
while((W>>l)) l++;
l--;
for(int i=0;i<=l;i++){
if(k[i].size()==0) continue;
else{
for(int j=0;j<k[i].size();j++){
for(int p=1000;p>=k[i][j];p--){
f[i][p]=max(f[i][p],f[i][p-k[i][j]]+val[i][j]);
}
}
}
}
for(int i=0;i<=l;i++){
for(int j=1000;j>=0;j--){
for(int p=0;p<=j;p++){
if(i==0) g[i][j]=max(g[i][j],f[i][p]);
else{
g[i][j]=max(g[i][j],g[i-1][(j-p)*2+((W>>(i-1)&1))]+f[i][p]);
}
}
}
}
cout<<g[l][1]<<"\n";
}
signed main(){
while(cin>>n>>W){
if(n==-1&&W==-1) break;
init(n);
}
}
P4138 [JOISC2014] 挂饰
- 题意:
一开始有一个挂钩,现在有
- 思路:
首先按照 由大到小排个序,把 当作重量, 当价值,跑遍 背包即可
#include<bits/stdc++.h>
using namespace std;
int n;
struct noe{
int a,b;
}z[4005];
bool cmp(noe x,noe y){
return x.a>y.a;
}
int f[4003][4003];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d%d",&z[i].a,&z[i].b);
}
sort(z+1,z+1+n,cmp);
for(int i=0;i<=n;i++) f[0][i]=-1e9,f[i][n+1]=-1e9;
f[0][1]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
f[i][j]=max(f[i-1][j],f[i-1][max(j-z[i].a,0)+1]+z[i].b);
}
}
int ans=-1e9;
for(int i=0;i<=n;i++) ans=max(ans,f[n][i]);
cout<<ans;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】