2022年4月25日完结
2022年4月25日11:46:37
01背包问题
完蛋没保存
简单背包
- 假装价值和重量一样
#include<bits/stdc++.h>
using namespace std;
//和简单背包一样,使用01背包的思想
int main(){
int s, n;
while(cin>>s>>n){
int w[n] = {0};
int dp[s] = {0};
for(int i = 0; i < n; i++){
cin>>w[i];
}
//
for(int i = 0; i < n; i++){
for(int j = s; j >= w[i]; j--){
dp[j] = max(dp[j], dp[j-w[i]] + w[i]);
}
}
if(dp[s] == s){
cout<<"yes!"<<endl;
}else{
cout<<"no!"<<endl;
}
}
return 0;
}
1567 01背包记录选择的物品编号
#include<bits/stdc++.h>
using namespace std;
const int M = 101, N = 1005;//最大金额,物品种类数
int main(){
int m, n;
while(cin>>m>>n){
int w[n+1] = {0}, v[n+1] = {0};
int dp[m+1] = {0};//
vector<int> path[N];
for(int i = 1; i <= n; i++){
cin>>w[i]>>v[i];
}
//
for(int i = 1; i <= n; i++){
for(int j = m; j >= w[i]; j--){
if(dp[j-w[i]] + v[i] > dp[j]){
dp[j] = dp[j-w[i]] + v[i];
path[j] = path[j-w[i]];
path[j].push_back(i);
}
}
}
cout<<dp[m]<<endl;
if(dp[m] != 0){
for(int i = 0; i < path[m].size(); i++){
cout<<path[m][i]<<" ";
}
cout<<endl;
}
}
return 0;
}
采药1086
- 物品的编号1开始
- 直接全部物品编号一开始就行
#include<bits/stdc++.h>
using namespace std;
int main(){
int t, m;//拥有的时间t,采药的种类m
while(cin>>t>>m){
int w[m+1] = {0}, v[m+1] = {0};
int dp[t+1] = {0};
for(int i = 1; i <= m; i++){
cin>>w[i]>>v[i];//
}
for(int i = 1; i <= m; i++){
for(int j = t; j >= w[i]; j--){
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
}
}
cout<<dp[t]<<endl;
}
return 0;
}
1568记忆化搜索
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
int dp[105][105] = {0};
int a[105][105];
int r, c;//行列
int dfs(int x, int y){
if(dp[x][y]) return dp[x][y];
int maxx = 1;
for(int i = 0; i < 4; i++){
int tx = x+dir[i][0];
int ty = y+dir[i][1];
if(tx >= 1 && tx <= r && ty >= 1 && ty <= c && a[tx][ty] > a[x][y]){//是自底向上的
maxx = max(dfs(tx, ty)+1, maxx);
}
}
dp[x][y] = maxx;
return maxx;
}
int main(){
while(cin>>r>>c){
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
cin>>a[i][j];
}
}
int ans = 0;
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
dp[i][j] = dfs(i, j);
ans = max(ans, dp[i][j]);
}
}
cout<<ans<<endl;
}
return 0;
}
2022年4月25日11:46:44