蒟蒻多重背包60分...
查看原帖
蒟蒻多重背包60分...
373938
wowwowwow楼主2022/4/22 22:51

代码写的很丑别介意

#include<bits/stdc++.h>
using namespace std;

const int N = 1e8;

int n, m, a[105], b[105], c[105], sum;

string sti[105];

int w[1005], shu[1005], t[1005], dp[N];

set<string> str;//其实能不用

map<string, int> fin;

//一堆定义

int main(){
	cin >> m >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i] >> b[i] >> c[i] >> sti[i];
		if(str.find(sti[i]) == str.end()){//合并,就是如果每出现过那么建一个,否则加上
			str.insert(sti[i]);
			fin[sti[i]] = sum + 1;
			w[++sum] = b[i];
			shu[sum] = a[i];
			t[sum] = c[i];
		}
		else{
			int r = fin[sti[i]];//出现过的序号
		    shu[r] += a[i]; 
		}
	}

	int jshu, jr, j = sum;
	for(int i = 1; i <= j; i++){//将物品个数为单位改成格子数为单位
		jshu = shu[i] / t[i];
		jr = shu[i] % t[i];
		w[++sum] = w[i] * jr;
		shu[sum] = 1;  
		w[i] = t[i] * w[i];
		shu[i] = jshu;
	}
	
	
	


	int V = 21 - m;
	for(int i = 1; i <= sum; i++){//多重背包
		for(int v = 0; v <= V; v++){
			for(int k = 0; k <= min(shu[i], v); k++){
				dp[v] = max(dp[v], dp[v - k] + k * w[i]);
			}
		}
		
	}
	cout << dp[V];
	
	return 0;
} 
2022/4/22 22:51
加载中...