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] ;  
} 
posted @ 2022-12-20 15:44  wmjlzw1314  阅读(143)  评论(0)    收藏  举报