chensongliang 2 years ago
commit 50af88f994

@ -0,0 +1,77 @@
#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct{
int v;
int w;
int no;
}goods;
int n,c;//物品数量,背包容量
int *x;//当前解
goods *a;//物品
int bv,*bx;//最优值,最优解
int cc,cw;//当前价值,当前重量
int cmp(goods a,goods b)//约定sort 所用cmp函数
{
return a.v*b.w>=a.w*b.v;
}
float Bound(int step){//贪心算法求得当前状态下对应背包的最优值
int i,m=c-cw;
float b=cc;
for(i=step; i<=n&&a[i].w<=m;i++)
b+=a[i].v, m-=a[i].w;
if(i<=n)
b+=(m*1.0/a[i].w)*a[i].v;
return b;
}
void dfs(int step){
int i;
if(step>n){//叶子结点
if(cc>bv){
bv=cc;
for(i=1;i<=n;i++)bx[a[i].no]=x[i];//序号还原
}
return;//回头
}
if(cw+a[step].w<=c){//满足约束条件,进入左子树
x[step]=1;
cc+=a[step].v;cw+=a[step].w;
dfs(step+1);
cc-=a[step].v;cw-=a[step].w;//恢复现场
}
if(Bound(step+1)>bv){//满足上界条件,进入右子树
x[step]=0;
dfs(step+1);
return;
}
}
int main(){
int i;
cout<<"请输入物品个数n"<<endl;
cin>>n;
a=new goods[n+1];
bx=new int[n+1];
x=new int[n+1];
cc=0;
cw=0;
bv=0;
cout<<"请输入背包容量c"<<endl;
cin>>c;
for(i=1;i<=n;i++)a[i].no=i,x[i]=0;
printf("请依次输入%d个物品的价值:\n",n);
for(i=1;i<=n;i++)cin>>a[i].v;
printf("请依次输入%d个物品的重量:\n",n);
for(i=1;i<=n;i++)cin>>a[i].w;
dfs(1);
printf("最优价值为:%d\n",bv);
cout<<"最优解为:"<<endl;
for(i=1;i<=n;i++)cout<<bx[i]<<'\t';
cout<<endl;
return 0;
}

@ -0,0 +1,11 @@
#include<iostream>
using namespace std;
int main(){
char ch='a';//创建字符变量,要用单引号
cout<<ch<<endl;
cout<<"所占内存空间:"<<sizeof(char)<<endl;
cout<<int(ch)<<endl;
system("pause");
return 0;
}

@ -0,0 +1,5 @@
public class HellowWorld{
public static void main(String[] args){
System.out.println("Hellow World");
}
}

@ -1,2 +0,0 @@
# domitory

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

@ -1 +0,0 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

11909
vue.js

File diff suppressed because it is too large Load Diff

@ -0,0 +1,55 @@
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
const int N = (1 << 20) + 10;
int n,m;
int v[N],w[N];
int res = -1;
int s[N]; // s[i]存储的是从第1件物品到第i件物品的价值总和
struct good{
int idx,c,r,tv; // idx表示选法下标c表示该选法的当前总价值r表示当前选法的剩余总价值tv表示该选法的当前总体积
bool operator > (const good& W) const{
return W.c + W.r > c + r;
}
}goods[N];
int bfs(){
goods[1] = {1,0,0,0};
priority_queue<good,vector<good>,greater<good>> q;
q.push(goods[1]);
while(q.size()){
auto t = q.top();
// cout << t.idx << endl;
q.pop();
int idx = t.idx << 1;
goods[idx] = {idx,goods[t.idx].c,s[n] - s[(int)log2(idx)],goods[t.idx].tv};
goods[idx + 1] = {idx + 1,goods[t.idx].c + w[(int)log2(idx)],s[n] - s[(int)log2(idx)],goods[t.idx].tv + v[(int)log2(idx)]};
if((int)log2(t.idx) == n) { // 假如已经是子节点,则更新答案
res = max(res,t.c);
continue;
}
if(goods[idx].tv <= m && goods[idx].c + goods[idx].r > res) q.push(goods[idx]); // 假如当前选法的总体积不超过背包容量,且当前价值+剩余价值 > 当前最优解,则装入背包
if(goods[idx + 1].tv <= m && goods[idx + 1].c + goods[idx + 1].r > res) q.push(goods[idx + 1]);
}
return res;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i],s[i] = s[i - 1] + w[i];
//
// for(int i = 2; i < 1 << n + 1; i ++){
// goods[i] = {i,goods[i >> 1].c + (i&1)*w[(int)log2(i)],s[n] - s[(int)log2(i)],goods[i >> 1].tv + (i&1)*v[(int)log2(i)]};
// }
//
// for(int i = 1; i < 1 << n + 1; i ++) printf("i = %d,c[i] = %d,r[i] = %d,tv[i] = %d\n",goods[i].idx,goods[i].c,goods[i].r,goods[i].tv);
cout << bfs() << endl;
return 0;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

@ -0,0 +1,27 @@
import java.util.Scanner;
public class hanoi {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数n");
int numDisks= scanner.nextInt();
char source = 'A'; // 源柱子
char auxiliary = 'B'; // 辅助柱子
char target = 'C'; // 目标柱子
solveHanoi(numDisks, source, auxiliary, target);
}
public static void solveHanoi(int numDisks, char source, char auxiliary, char target) {
if (numDisks == 1) {
System.out.println("移动盘子 1 从柱子 " + source + " 到柱子 " + target);
} else {
// 将numDisks-1个盘子从源柱子移动到辅助柱子借助目标柱子
solveHanoi(numDisks - 1, source, target, auxiliary);
// 移动最底下的一个盘子到目标柱子
System.out.println("移动盘子 " + numDisks + " 从柱子 " + source + " 到柱子 " + target);
// 将numDisks-1个盘子从辅助柱子移动到目标柱子借助源柱子
solveHanoi(numDisks - 1, auxiliary, source, target);
}
}
}
Loading…
Cancel
Save