0-1背包问题 ,背包问题(可视化)

0-1背包问题

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>
#define N 30
#define c 10000

int m[N+1][c];
int zeroOrOne[N];
int flag;
int total_w = 0, total_v = 0;

struct {
int w;//重量
int v;//价值
}wuPing[N];

void drawPoint(int i) {
if (flag == 0) {
setlinecolor(BLACK);
circle(wuPing[i].w, wuPing[i].v, 4);
}
else {
setlinecolor(RED);
setfillcolor(RED);
fillcircle(wuPing[i].w, wuPing[i].v, 4);
}
}

void init() {
setlinecolor(BLACK);
setfillcolor(BLACK);
line(15, 15, 1200, 15);
line(1200,15,1180,5);
line(1200, 15, 1180, 25);
settextcolor(RED);
outtextxy(1165,-3,‘w’);
outtextxy(0, 565, ‘v’);
outtextxy(18, -2, ‘1’);
outtextxy(23, -2, ‘5’);
line(15, 15, 15, 600);
line(15, 600, 5, 580);
line(15, 600, 25, 580);
settextcolor(RED);
outtextxy(0, 565, ‘v’);
outtextxy(0, 18, ‘1’);
outtextxy(5, 18, ‘5’);
srand((unsigned)time(NULL));
for (int i = 0; i < N; i++) {
wuPing[i].w = rand() % 1170 + 25;
wuPing[i].v = rand() % 565 + 30;
}
for (int i = 0; i < N; i++) {
printf(“第%d件: 重量:%d 价值:%d\n”, i + 1, wuPing[i].w, wuPing[i].v);
flag = 0;
drawPoint(i);
}
printf("\n\n目前设置的最大容量为:%d-------------------------------------------\n",c);

for (int i = N, j = 0; j <= c; j++)
	m[i][j] = 0;

}
void dongTaiHuiHua() {
for (int i = N-1; i >= 0; i–) {
for (int j = 0; j <= c; j++) {
if (wuPing[i].w > j || (wuPing[i].v + m[i + 1][j - wuPing[i].w] ) < m[i + 1][j])
m[i][j] = m[i+1][j];
else
m[i][j] = wuPing[i].v + m[i + 1][j - wuPing[i].w];
}
}
}

void shuChuJieGuo(int i) {

//printf("第%d件物品----重量:%d  价值:%d\n", i + 1, wuPing[i].w, wuPing[i].v);
total_w += wuPing[i].w;
total_v += wuPing[i].v;
printf("加入第%d件物品  总重量:%d   总价值:%d\n", i+1,total_w, total_v);

}

void beiBao() {
dongTaiHuiHua();
int j = c;
for (int i = 0; i < N; i++) {
if (m[i][j] != m[i + 1][j]) {
j -= wuPing[i].w;
flag = 1;
drawPoint(i);
Sleep(1000);
shuChuJieGuo(i);
}

}

}

int main() {
initgraph(1200, 600,SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
init();
beiBao();

printf("结束!\n");
while (1);
return 0;

}

视频链接:https://www.bilibili.com/video/BV1H64y1R7uM?from=search&seid=9984290354594554876

背包问题

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>
#define N 30
#define c 10000

int flag;
int total_w = 0, total_v = 0;

struct {
double w;//重量
double v;//价值
double VchuyiM;
}wuPing[N];

void drawPoint(int i) {
if (flag == 0) {
setlinecolor(BLACK);
circle(wuPing[i].w, wuPing[i].v, 4);
}
else {
setlinecolor(RED);
setfillcolor(RED);
fillcircle(wuPing[i].w, wuPing[i].v, 4);
}
}
void paiXu() {
double temp;
for(int i = N-1;i > 0;i–)
for (int j = 0; j < i; j++) {
if (wuPing[j].VchuyiM < wuPing[j + 1].VchuyiM) {
temp = wuPing[j].VchuyiM;
wuPing[j].VchuyiM = wuPing[j + 1].VchuyiM;
wuPing[j + 1].VchuyiM = temp;

			temp = wuPing[j].v;
			wuPing[j].v = wuPing[j + 1].v;
			wuPing[j + 1].v = temp;

			temp = wuPing[j].w;
			wuPing[j].w = wuPing[j + 1].w;
			wuPing[j + 1].w = temp;
		}
	}

}
void init() {
setlinecolor(BLACK);
setfillcolor(BLACK);
line(15, 15, 1200, 15);
line(1200, 15, 1180, 5);
line(1200, 15, 1180, 25);
settextcolor(RED);
outtextxy(1165, -3, ‘w’);
outtextxy(0, 565, ‘v’);
outtextxy(18, -2, ‘1’);
outtextxy(23, -2, ‘5’);
line(15, 15, 15, 600);
line(15, 600, 5, 580);
line(15, 600, 25, 580);
settextcolor(RED);
outtextxy(0, 565, ‘v’);
outtextxy(0, 18, ‘1’);
outtextxy(5, 18, ‘5’);
srand((unsigned)time(NULL));
for (int i = 0; i < N; i++) {
wuPing[i].w = (double)(rand() % 1170 + 25);
wuPing[i].v = (double)(rand() % 565 + 30);
wuPing[i].VchuyiM = wuPing[i].v / wuPing[i].w;
}
paiXu();
for (int i = 0; i < N; i++) {
printf(“第%d件: 重量:%.0f 价值:%.0f 价值/重量:%f\n”, i + 1, wuPing[i].w, wuPing[i].v, wuPing[i].VchuyiM);
flag = 0;
drawPoint(i);
}
printf("\n\n目前设置的最大容量为:%d\n-------------------------------------------\n", c);

}

void shuChuJieGuo(int i) {

//printf("第%d件物品----重量:%d  价值:%d\n", i + 1, wuPing[i].w, wuPing[i].v);
total_w += wuPing[i].w;
total_v += wuPing[i].v;
printf("加入第%d件物品  总重量:%d   总价值:%d\n", i + 1, total_w, total_v);

}

void beiBao() {
double shengYu = c;
int i = 0;
while (wuPing[i].w < shengYu){
flag = 1;
drawPoint(i);
Sleep(1000);
shengYu -= wuPing[i].w;
shuChuJieGuo(i);
i++;
}
printf(“第%d件物品加入了%.0f\n”, i+1, shengYu);
}

int main() {
initgraph(1200, 600, SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
init();
beiBao();

printf("结束!\n");
while (1);
return 0;

}

视频链接:https://www.bilibili.com/video/BV1Bo4y1C7Mh?from=search&seid=6111520711482781817

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

底层开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值