博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Atcoder regular Contest 073(D - Simple Knapsack)
阅读量:5901 次
发布时间:2019-06-19

本文共 1182 字,大约阅读时间需要 3 分钟。

Atcoder regular Contest 073(D - Simple Knapsack)

因为 w1≤wi≤w1+3 这个特殊条件,我们可以将每个重量离散化一下,同时多开一维记录选择的物品数量,因此可以由状态得到此时的实际背包重量.

dp[i][j][k]为考虑前i个物品,背包剩余容量,取了k个物品。此时的实际背包重量为k*w1+j

#include
#include
#include
#include
#include
#include
#include
#define ll long long#define inf 1000000000LL#define mod 1000000007using namespace std;int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f;}ll dp[105][305][105],w[105];int v[105];int main(){ // while(true) { int n=read(),V=read(); for(int i=1;i<=n;i++){ w[i]=read();v[i]=read(); if(i>1){ w[i]=w[i]-w[1]; } } memset(dp,0,sizeof(dp)); int w1=w[1]; w[1]=0; for(int i=1;i<=n;i++){ for(int j=0;j<=300;j++){ for(int k=1;k<=n;k++){ if(j>=w[i]) dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-w[i]][k-1]+v[i]); else dp[i][j][k]=dp[i-1][j][k]; } } } ll ans=0; for(ll i=0;i<=300;i++){ for(ll j=0;j<=n;j++){ if(j*w1+i<=V){ ans=max(ans,dp[n][i][j]); } } } printf("%I64d\n",ans); } return 0;}

转载于:https://www.cnblogs.com/zsyacm666666/p/6786593.html

你可能感兴趣的文章
QT 按钮(4种样式)
查看>>
踏破铁鞋,Vmware 8完美安装Mac Lion狮子系统,CPU不支持虚拟化,键盘无响经验共享...
查看>>
nutch 与 solr 的结合
查看>>
Introduction
查看>>
c#正则表达式 特殊格式内容的提取
查看>>
Javascript innerhtml
查看>>
hdu 1811 Rank of Tetris(并查集+拓扑排序)
查看>>
转:3位90后创业!PeakLabs推猛犸5等产品
查看>>
从简单工厂到工厂方法
查看>>
MySQL innodb_table_monitor 解析
查看>>
MFC消息机制
查看>>
IP设置应用v1.0
查看>>
软件标准名称
查看>>
SQLite函数大全
查看>>
分享:R语言最好的IDE——RStudio
查看>>
IIS7下备份、还原站点配置
查看>>
java发送http的get、post请求
查看>>
Pseudo-random sequence generation
查看>>
Asp.net cookie的处理流程你真的知道吗?
查看>>
jQuery 1.9 beta1 发布,删除被废弃的 API
查看>>