dp2
P1616 疯狂的采药
完全背包,一维数组正着做就可以
#include<bits/stdc++.h>
using namespace std;
int v[100200] , t , m;
int f[100020] , w[100020];
int main () {
cin >> t >> m;
for(int i = 1; i <= m;i++){
cin >> w[i] >> v[i];
}
for(int i = 1;i <= m; i++){
for(int j = w[i];j <= t; j++ ){
f[j] = max(f[j - w[i]] + v[i] , f[j]);
}
}
cout << f[t] << endl;
}
P1833樱花
正解是混合背包,二进制优化后就不用混合背包了
#include<bits/stdc++.h>
using namespace std;
int x , y , x2 , y2;
const int N = 1000200;
int a , b , c , cnt;
int w[N] , v[N] , n , m ;
int f[N];
int main () {
scanf("%d:%d %d:%d %d" ,&x , &y , &x2 , &y2 , &n);
if(y2 < y){
x2--;
y2 += 60;
}
m = (x2 - x) * 60 + y2 - y;
for(int i = 1;i <= n ; i ++){
scanf("%d%d%d" , &a , &b , &c);
if(!c)c = 999999;
int k = 1;
while(c != 0){
w[++cnt] = k * a;
v[cnt] = k * b;
c -= k;
k *= 2;
if(c < k){
w[++cnt] = a * c;
v[cnt] = b * c;
break;
}
}
}
for(int i = 1; i <= cnt ; i++){
for(int j = m ; j >= w[i] ; j --){
f[j] = max(f[j] , f[j-w[i]] + v[i]);
}
}
cout << f[m] << endl;
}
P1077摆花
这个题的话 就变成了这个模型
对于一个容量m
对于一种物品,有t个
然后填满背包的方案数
#include<bits/stdc++.h>
using namespace std;
int n , m ;
const int N = 2000;
int a[N];
int f[N];
const int p = 1000007;
int main () {
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++){
scanf("%d" , &a[i]);
}
f[0] = 1;
for(int i = 1; i <= n ; i ++){
for(int j = m ; j >= 0 ; j --){
for(int k = 1 ;k <= min(a[i] , m) ; k ++){
f[j] = (f[j] + f[j - k]) % p;
}
}
}
cout << f[m] << endl;
}
P1064金明的预算方案
能选主件的时候max一次
能选主加1附max一次
主加2附max一次
#include<bits/stdc++.h>
using namespace std;
int n , m;
int f[100020];
const int N = 100002;
int mw[N] , mv[N] , fw[N][3] , fv[N][3] ;
int main (){
cin >> m >> n ;
for(int i = 1; i <= n ; i ++){
int x , y , z;
cin >> x >> y >> z;
if(z == 0){
mw[i] = x;
mv[i] = x * y;
}
else{
fw[z][0] ++ ;
fw[z][fw[z][0]] = x;
fv[z][fw[z][0]] = x * y ;
}
}
for(int i = 1; i <= n ; i ++){
for(int j = m ; j >= mw[i]; j --){
f[j] = max(f[j] , f[j - mw[i]] + mv[i]);
if(j >= mw[i] + fw[i][1]){
f[j] = max(f[j] , f[j - mw[i] - fw[i][1]] + mv[i] + fv[i][1]);
}
if(j >= mw[i] + fw[i][2]){
f[j] = max(f[j] , f[j - mw[i] - fw[i][2]] + mv[i] + fv[i][2]);
}
if(j >= mw[i] + fw[i][1] + fw[i][2]){
f[j] = max(f[j] , f[j - (mw[i] + fw[i][1] + fw[i][2])] + mv[i] + fv[i][1] + fv[i][2] );
}
}
}
cout << f[m] ;
}

浙公网安备 33010602011771号