codeforces 19B
题意:
给
定
n
件
商
品
的
收
银
时
长
和
价
值
,
若
收
银
时
长
不
为
0
,
你
可
以
每
隔
一
秒
偷
一
件
商
品
。
给定n件商品的收银时长和价值,若收银时长不为0,你可以每隔一秒偷一件商品。
给定n件商品的收银时长和价值,若收银时长不为0,你可以每隔一秒偷一件商品。
问
最
少
需
要
多
少
钱
可
以
带
走
所
有
商
品
。
问最少需要多少钱可以带走所有商品。
问最少需要多少钱可以带走所有商品。
题解:
将
t
i
+
1
视
为
第
i
件
物
品
的
体
积
,
将
问
题
转
化
为
01
背
包
。
将t_i+1视为第i件物品的体积,将问题转化为01背包。
将ti+1视为第i件物品的体积,将问题转化为01背包。
d
p
[
j
]
表
示
拿
走
j
件
物
品
的
最
小
代
价
。
dp[j]表示拿走j件物品的最小代价。
dp[j]表示拿走j件物品的最小代价。
- d p [ j ] = m i n ( d p [ j ] , d p [ m a x ( j − w [ i ] , 0 ) ] + v [ i ] ) dp[j] = min(dp[j], dp[max(j-w[i], 0)]+v[i]) dp[j]=min(dp[j],dp[max(j−w[i],0)]+v[i])
#include <bits\stdc++.h>
using namespace std;
const int N = 2001;
int w[N], v[N];
long long dp[N];
int main() {
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++){
cin >> w[i] >> v[i];
w[i]++;
}
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for(int i = 1 ; i <= n ; i++){
for(int j = n ; j >= 1 ; j--){
dp[j] = min(dp[j], dp[max(j-w[i], 0)]+v[i]);
}
}
cout << dp[n] << endl;
return 0;
}